应用程序在iPhone 5c上的主线程上冻结,但在iPhone 6s上没有冻结
我正在使用导航控制器开发应用程序。 Swift + Objective C
重要提示:在iPhone 5c上进行测试时,这种冻结会100%发生,而在iPhone 6s上进行测试则不会发生
场景是:
- 转到TableViewController A.
- 触摸列表中的项目即可访问TableViewController B.
- 按左上箭头返回TVController A.
- 该应用程序显示TableViewController A但立即冻结
用户界面已冻结,但应用仍在运行。 如果我按下暂停按钮(调试模式),我可以看到线程1(主线程)堆栈是:
0 semaphore_wait_trap 45 UIApplicationMain 46 main 47 start
我不知道从哪里开始调查,以便找到问题所在。
有任何想法吗?
经过一天的调查,我终于发现它与MKMapView deinit相关联。
后来我发现这个post关于一个非常相似的话题:
警告:片段着色器无法读取顶点着色器’v_gradient’的输出
根据 – 上帝 – @mojuba,他发现冻结也与deinit阶段相关,为DEBUG模式提供了修复。 因为这个问题似乎只发生在DEBUG ……
我成功地将他的修复程序应用于我的代码如下:
deinit { #if DEBUG // Xcode8/iOS10 MKMapView bug workaround if let mV = locationPickerView.mapView { VControllerB.unusedObjects.append(mV) // addObject:_mapView]; } #endif }
请注意,这会产生内存泄漏,因为mapView永远不会被释放并保存在VControllerB类的静态数组中。
注2:我在1月27日使用Xcode 8.2.1时报告了Apple Bug Reporter中的错误。
这是一个僵局。 看起来你在主线程上使用dispatch_sync。 解决问题 – 检查其他线程。 在某些线程中,您将找到调度块结束时正在等待的代码…