我正在尝试使用新的 Xcode 16.0 在 iOS 18.0 的设备上构建并运行我的应用程序,但它在启动后立即崩溃并显示以下堆栈跟踪:
0 libobjc.A.dylib`_objc_warn_deprecated
1 realizeClassWithoutSwift
2 map_images_nolock
3 map_images
4 invocation function for block in dyld4::RuntimeState::setObjCNotifiers(void (*)(char const", mach_header const*), void (*)(mach_header con...apped_info const*), void (*) (unsigned int, _dyld _objc_notify_mapped_info const*, void (unsigned int) block_pointer))::$_0::operator)( const
5 dyld4::RuntimeLocks::withLoadersReadLock
6 dyld4::RuntimeState::setObjCNotifiers
7 dyld4:: APls::_dyld_objc_register_callbacks
8_objc_init
9_os_object_init
10 libdispatch_init
11 libSystem_initializer
12 invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const
13 invocation function for block in dyld3::MachOAnalyzer::forEachinitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const
14 invocation function for block in dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const
15 dyld3::MachOFile::forEachLoadCommand
16 dyld3::MachOFile::forEachSection
17 dyld3::MachOAnalyzer::forEachInitializer
18 dyld4::Loader::findAndRunAllinitializers
19 dyld4::JustInTimeLoader::runInitializers
20 dyld4::APIs::runAllinitializersForMain
21 dyld4:: prepare
22 dyld4::start(dyld4::KernelArgs*, void*, void*)::$_0::operatori() const
23 start
如果我从 Xcode 16.0 构建并运行到装有 iOS 15 或 iOS 17 的设备,则应用程序会成功构建并运行。
这是控制台中唯一的东西,但我的感觉是它不相关,因为当应用程序在其他设备上成功运行时它也会出现:
warning: (arm64) /Users/username/Library/Developer/Xcode/DerivedData/AppName-gevkjrdhpvsixnciokrsaracikam/Build/Products/Debug-iphoneos/AppName.app/AppName empty dSYM file detected, dSYM was created with an executable with no debug info.
我最初用 Objective-C 编写我的应用程序,后来将其大部分转换为 Swift。由于仍然保留了一些小的 Objective-C 类,它仍然具有 Swift 和 Objective-C 桥接头文件。但为了解决 iOS 18 SDK 中 PDFDocument.h 的构建错误(我向 Apple 报告了该错误,FB15106102),我注释掉了 .pch 文件中的
#import "AppName-Swift.h"
并清理了构建文件夹以删除 Objective-C快速桥接。其余的 Objective-C 代码都不需要引用我的 Swift 类,因此不需要,删除它可以让应用程序构建和运行(短暂地)。也许应用程序崩溃是因为我需要做其他事情来删除它;另一方面,它现在在较旧的 iOS 版本上运行良好。
我在这里找到了
realizeClassWithoutSwift
的源代码:
https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.mm.auto.html
我还没有找到任何有关
libobjc.A.dylib _objc_warn_deprecated
消息的信息。
我已向 Apple 报告了此次崩溃(FB15106573),但我希望在这里得到一些想法,因为谁知道 Apple 是否以及何时会做出回应。
更新
我用这个答案删除了控制台警告,但同样的崩溃仍然发生。然而,这个问题似乎确实与调试有关,因为我注意到应用程序崩溃后,我可以从 Xcode 停止它,然后通过单击设备上的应用程序图标来运行它,并且它运行良好。它只会在从 Xcode 运行时崩溃。
更新2
Xcode 16.1 和 iOS 18.1 中问题没有改变。
我终于解决了这个问题。我的应用程序有三个 Objective-C 断点。我不记得它们的用途,而且可能不需要它们,因为我用 Swift 重写了应用程序。我确实找到了我已经投票的这个旧的 SO 帖子,所以这可能是促使我添加 objc_autoreaseNoPool 断点的原因。
无论如何,当我删除该断点后,问题立即消失了。现在我终于可以在 iOS 18 和 macOS 15 上调试了。