在 Xcode 16 和 iOS 18 中使用“_objc_warn_deprecated”启动时崩溃

问题描述 投票:0回答:1

我正在尝试使用新的 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 中问题没有改变。

swift objective-c ios18 xcode16
1个回答
0
投票

我终于解决了这个问题。我的应用程序有三个 Objective-C 断点。我不记得它们的用途,而且可能不需要它们,因为我用 Swift 重写了应用程序。我确实找到了我已经投票的这个旧的 SO 帖子,所以这可能是促使我添加 objc_autoreaseNoPool 断点的原因。

无论如何,当我删除该断点后,问题立即消失了。现在我终于可以在 iOS 18 和 macOS 15 上调试了。

© www.soinside.com 2019 - 2024. All rights reserved.