应用程序在 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
上测试时永远不会发生
场景是:
- 转到 TableViewController A
- 触摸列表中的一项以到达 TableViewController B
- 按左上箭头返回 TVController A
- 应用程序显示 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 中的错误。
我正在开发一个带有导航控制器的应用程序。 Swift + objective C
重要提示: 在 iPhone 5c 上测试时会 100% 发生这种冻结,而在 iPhone 6s
上测试时永远不会发生场景是:
- 转到 TableViewController A
- 触摸列表中的一项以到达 TableViewController B
- 按左上箭头返回 TVController A
- 应用程序显示 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 中的错误。