Xcode 14 Beta 5运行iOS 16适配应用时崩溃问题求助
适配iOS16时Xcode14 Beta5启动崩溃问题解决
问题背景
现有应用在Xcode13中运行正常,App Store版本安装到iOS16测试设备也能正常使用,但使用Xcode14 Beta5运行时,启动到第一个视图控制器后崩溃,报错信息如下:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application circumvented Objective-C runtime dealloc initiation for <UINavigationController> object.' *** First throw call stack: ( 0 CoreFoundation 0x00007ff800427380 __exceptionPreprocess + 242 1 libobjc.A.dylib 0x00007ff80004dbaf objc_exception_throw + 48 2 Foundation 0x00007ff800b876ac _userInfoForFileAndLine + 0 3 UIKitCore 0x0000000124447d4e -[UIViewController dealloc] + 1475 4 UIKitCore 0x0000000124359e30 -[UINavigationController dealloc] + 389 5 libobjc.A.dylib 0x00007ff80004b6a1 _ZN11objc_object17sidetable_releaseEbb + 203 6 libobjc.A.dylib 0x00007ff80004be64 _ZN19AutoreleasePoolPage12releaseUntilEPP11objc_object + 180 7 libobjc.A.dylib 0x00007ff80004bcad objc_autoreleasePoolPop + 203 8 UIKitCore 0x00000001252e54bf -[_UIAfterCACommitBlock run] + 80 9 UIKitCore 0x00000001252e59a4 -[_UIAfterCACommitQueue flush] + 190 10 UIKitCore 0x0000000124d40730 _runAfterCACommitDeferredBlocks + 782 11 UIKitCore 0x0000000124d2eede _cleanUpAfterCAFlushAndRunDeferredBlocks + 96 12 UIKitCore 0x0000000124d64abb _afterCACommitHandler + 72 13 CoreFoundation 0x00007ff800386015 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 14 CoreFoundation 0x00007ff800380982 __CFRunLoopDoObservers + 515 15 CoreFoundation 0x00007ff800380ecd __CFRunLoopRun + 1161 16 CoreFoundation 0x00007ff800380667 CFRunLoopRunSpecific + 560 17 GraphicsServices 0x00007ff809bfc28a GSEventRunModal + 139 18 UIKitCore 0x0000000124d30621 -[UIApplication _run] + 994 19 UIKitCore 0x0000000124d354fd UIApplicationMain + 123 20 xxxxxx 0x000000010e9aa830 main + 96 21 dyld 0x00000001136e52bf start_sim + 10 22 ??? 0x00000001148c751e 0x0 + 4639716638 )
问题原因
Xcode14 Beta版本的UIKit对UIViewController(包括UINavigationController)的dealloc流程新增了严格校验,当代码或第三方库存在绕过Objective-C runtime正常dealloc触发流程的操作时,就会抛出这个异常。常见场景包括:
- 手动调用
-[UINavigationController dealloc]或其子类的dealloc方法 - 第三方AOP/埋点框架hook了dealloc方法,干扰了正常释放流程
- 内存管理错误,比如重复调用release、循环引用导致对象释放时机异常
- Swift代码中@objc类的deinit方法调用了Objective-C内存管理相关方法,引发冲突
解决步骤
- 排查代码中是否存在手动调用dealloc的情况,移除所有直接调用
[super dealloc]以外的手动dealloc调用(Objective-C中仅需在子类dealloc最后调用一次super dealloc) - 临时移除或禁用第三方hook类库(比如埋点、日志、AOP框架),逐一排查是否是某个库导致的问题,如有则更新至适配Xcode14的版本
- 用Xcode的内存调试工具(Leaks、Zombies)检查是否存在循环引用或内存管理异常,修复相关问题
- 如果是Swift项目,检查@objc修饰的类的deinit方法,避免在其中调用可能干扰Objective-C内存管理的方法
- 尝试升级到Xcode14的后续版本(如RC版或正式版),Beta版本可能存在校验逻辑的bug,正式版通常会修复这类问题
内容的提问来源于stack exchange,提问作者birdcage
相关产品推荐
相关产品推荐

