Swift iOS 11或iOS 10.3之后的快速内存问题

Swift iOS 11或iOS 10.3之后的快速内存问题,swift,memory,memory-management,ios11,Swift,Memory,Memory Management,Ios11,我有一个应用程序,使用地理围栏和信标,因为大约一年的应用程序商店。最近,我注意到越来越多的崩溃,用户在geofence进入或退出时报告丢失的通知(我在进入或退出时发送本地通知)。 所以我怀疑那些崩溃报告与那些用户报告有关。崩溃报告指出内存管理问题:lib dispatch.dylib\u dispatch\u callblock\u和\u release 这些问题仅在iOS 10.3之后出现。所以我有一些iOS 10.3版的报告,但大多数都是iOS 11版的。当我在模拟器中运行应用程序时,内存使

我有一个应用程序,使用地理围栏和信标,因为大约一年的应用程序商店。最近,我注意到越来越多的崩溃,用户在geofence进入或退出时报告丢失的通知(我在进入或退出时发送本地通知)。 所以我怀疑那些崩溃报告与那些用户报告有关。崩溃报告指出内存管理问题:lib dispatch.dylib\u dispatch\u callblock\u和\u release

这些问题仅在iOS 10.3之后出现。所以我有一些iOS 10.3版的报告,但大多数都是iOS 11版的。当我在模拟器中运行应用程序时,内存使用量大约为50MB,并且不会增加。甚至当我模拟geofence入口和出口等时,它的使用量也保持在50MB左右

因此,我的第一个问题是,当应用程序仅使用50MB时,它是否可能在不在前台时崩溃

为了进一步研究,我实现了函数func applicationIDReceiveMemoryWarning(application:UIApplication) 并在收到呼叫时发送本地通知。事实上,有时我会收到这样的警告,我自己也会收到土工围栏进出通知的违规情况

现在为了进一步调查,我安装了另一个应用程序来监控同一个地理围栏(IFTTT)。这里我也有土工围栏进出通知的违规行为

直到现在,我还是很放松,因为我确信早期的iOS 11测试版存在内存管理问题。但我正在使用最新的测试版(15A5372a),我想我们现在已经接近决赛了。我还担心的是,一些用户在iOS 10.3中也会遇到这些问题

你知道如何进一步调查这个问题吗?或者有没有人经历过类似的事情

非常好 斯蒂芬

编辑:今天,我再次体验到iOS 11 Golden Master的一种奇怪行为。昨天下午16:30左右我到家了。未触发IFTTT区域。或者至少我没有收到通知。当我今天早上离开家的时候,我收到了离开通知,但同时我收到了昨天的进入通知。因此,我怀疑当应用程序在后台运行时,iOS 11的内存分配会发生一些一般性的变化

编辑:

我做了进一步的调查。。因此,我实现了applicationIDReceiveMemoryWarning方法,并向我的测试人员展示了该警告

这是我的代码:

func applicationDidReceiveMemoryWarning(_ application: UIApplication) {

    let memoryinuse = report_memory()

    let notification = UILocalNotification()
    notification.alertBody = "MemoryWarning. Memory in use: \(memoryinuse)"
    notification.soundName = "Default"
    UIApplication.shared.presentLocalNotificationNow(notification)

    print("MemoryWarning. Memory in use: \(memoryinuse)")

}
要查看应用程序使用了多少内存,我有以下功能:

func report_memory() -> String {
    var taskInfo = mach_task_basic_info()
    var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size)/4
    let kerr: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
        $0.withMemoryRebound(to: integer_t.self, capacity: 1) {
            task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
        }
    }

    if kerr == KERN_SUCCESS {
        print("Memory used in bytes: \(taskInfo.resident_size)")
    }
    else {
        print("Error with task_info(): " +
            (String(cString: mach_error_string(kerr), encoding: String.Encoding.ascii) ?? "unknown error"))
        return "error"
    }

    let mbinuse = taskInfo.resident_size / 1000000

    return String(mbinuse) + " MB"
}
func report\u memory()->字符串{
var taskInfo=mach_task_basic_info()
变量计数=马赫数信息类型编号(内存大小)/4
让kerr:kern\u返回\u t=withunsafemtablepointer(to:&taskInfo){
$0.withMemoryRebound(收件人:integer\u.self,容量:1){
任务信息(马赫任务自身、任务风格、马赫任务基本信息、$0和计数)
}
}
如果kerr==KERN_成功{
打印(“以字节为单位使用的内存:\(taskInfo.resident\u size)”)
}
否则{
打印(“任务信息错误:”+
(字符串(cString:mach_error_String(kerr),编码:String.encoding.ascii)??“未知错误”))
返回“错误”
}
设mbinuse=taskInfo.resident\u size/1000000
返回字符串(mbinuse)+“MB”
}
我从用户那里得到了第一次反馈。函数report_memory()中报告的7到18MB之间的内容经常会导致获取此内存

因此,如果我的代码错误,使用的内存没有正确报告,或者如果iPhone 6或7在后台活动时(进入地理围栏或信标区域时)使用7MB的应用程序确实可能报告内存警告,我会挠头

非常感谢 斯蒂芬