Xcode 15下App崩溃:_OBJC_METACLASS_$_NSObject符号未找到
Xcode 15 下 Swift App 集成 Objective-C 框架时 @try-catch 声明 NSObject 类型异常崩溃问题
问题场景
- 工作区包含Swift应用项目 + Objective-C框架
- 框架中
@try-catch代码块里,若将异常对象声明为NSObject类型,App在Xcode 15中运行立即崩溃 - 异常声明为
NSException、NSError或id类型时无崩溃问题 - 修复一处此类问题后,出现新的类似崩溃,涉及符号变为
_OBJC_CLASS_$_NSObject等
可能原因
这大概率是Xcode 15中Clang/LLVM编译器对Objective-C异常处理的类型检查或符号绑定逻辑变更导致的:
- 异常类型匹配逻辑收紧:Xcode 15的编译器可能对
@catch块的异常类型做了更严格的校验,NSObject作为根类,编译器在处理其异常捕获时的符号解析逻辑出现bug,无法正确绑定NSObject的类符号 - Swift-ObjC交互的ABI变化:Xcode 15更新了Swift与Objective-C交互的ABI实现,当ObjC框架中使用非标准异常类型(
NSObject并非标准异常类型)时,跨语言的异常传递流程出现符号查找失败
可行修复方案
1. 替换异常类型(推荐)
将@catch块中的NSObject类型替换为标准异常类型或id:
// 原崩溃代码 @try { // 抛出异常逻辑 } @catch (NSObject *exception) { // 捕获处理 } // 修改后代码(标准异常类型) @try { // 抛出异常逻辑 } @catch (NSException *exception) { // 捕获处理 } // 或使用id兼容所有类型 @try { // 抛出异常逻辑 } @catch (id exception) { // 捕获处理 }
2. 调整编译选项
针对Objective-C框架项目,尝试添加以下编译选项:
- 在Build Settings -> Other C Flags中添加:
-fobjc-exceptions(确保异常处理开启,部分场景下Xcode 15默认配置可能有差异) - 关闭Build Settings -> Enable Strict Checking of objc_msgSend Calls(若开启,可能加剧类型校验的严格程度)
3. 临时规避方案
若无法批量修改异常类型,可尝试:
- 将Objective-C框架的Build Settings -> Deployment Target暂时下调到iOS 15或更低(部分旧版编译器逻辑可能兼容此场景)
- 在框架的
Prefix Header中显式导入NSObject.h,确保符号提前绑定:
#import <Foundation/NSObject.h>
内容的提问来源于stack exchange,提问作者WoffOVkee
相关产品推荐
相关产品推荐

