应用程序在 iPhone 5c 时在主线程上冻结,但在 iPhone 6s 时不会

App freezes on main thread on iPhone 5c but not on iPhone 6s

我正在开发一个带有导航控制器的应用程序。 Swift + objective C

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

上测试时永远不会发生

场景是:

  1. 转到 TableViewController A
  2. 触摸列表中的一项以到达 TableViewController B
  3. 按左上箭头返回 TVController A
  4. 应用程序显示 TableViewController A 但立即冻结

UI 已冻结,但应用程序仍 运行。 如果我按下暂停按钮(调试模式),我可以看到线程 1(主线程)堆栈是:

0 semaphore_wait_trap
45 UIApplicationMain
46 main
47 start

我不知道从哪里开始调查才能找到问题所在。

有什么想法吗?

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

经过一天的调查, 我终于发现它链接到 MKMapView deinit。

后来我发现这个 post 关于一个非常相似的主题:

根据 - 神 - @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 的静态数组中 class。

注意 2:我在 1 月 27 日使用 Xcode 8.2.1 时报告了 Apple Bug Reporter 中的错误。