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

时间:2017-01-26 08:49:32

标签: ios objective-c iphone swift freeze

我正在使用导航控制器处理应用。 Swift + Objective C

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

场景是:

  1. 转到TableViewController A
  2. 触摸列表中的项目以访问TableViewController B
  3. 按左上箭头
  4. 返回TVController A.
  5. 该应用程序显示TableViewController A但立即冻结
  6. UI已冻结,但应用仍在运行。 如果我按下暂停按钮(调试模式),我可以看到线程1(主线程)堆栈是:

    0 semaphore_wait_trap
    45 UIApplicationMain
    46 main
    47 start
    

    我不知道从哪里开始调查,以便找到问题所在。

    Stack on main thread

    有什么想法吗?

2 个答案:

答案 0 :(得分:1)

经过一天的调查, 我终于发现它与MKMapView deinit相关联。

后来我发现这篇文章的主题非常相似:

WARNING: Output of vertex shader 'v_gradient' not read by fragment shader

根据 - 神 - @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中的错误。

答案 1 :(得分:0)

这是一个僵局。看起来你在主线程上使用dispatch_sync。 解决问题 - 检查其他线程。在某些线程中,您将找到调度块结束时正在等待的代码...