应用程序在iPhone 5c上的主线程上冻结,但在iPhone 6s上没有冻结

我正在使用导航控制器开发应用程序。 Swift + Objective C

重要提示:在iPhone 5c上进行测试时,这种冻结会100%发生,而在iPhone 6s上进行测试则不会发生

场景是:

  1. 转到TableViewController A.
  2. 触摸列表中的项目即可访问TableViewController B.
  3. 按左上箭头返回TVController A.
  4. 该应用程序显示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。 解决问题 – 检查其他线程。 在某些线程中,您将找到调度块结束时正在等待的代码…