重命名方法后参数类型正常却触发NSInvalidArgumentException?
解决重命名方法后调用
super sceneDidConnectWithOptions:崩溃的NSInvalidArgumentException问题 排查方法签名的隐性不一致
虽然你看到的父类和子类方法签名表面一致,但要抠细节:- 检查参数的nullable/nonnull修饰符:比如父类方法可能是
- (void)sceneDidConnectWithOptions:(nullable UISceneConnectionOptions *)connectionOptions;,子类没加nullable,这种细微差异会导致运行时方法匹配失败,触发参数类型异常。 - 确认父类头文件是否被正确引入,子类的继承声明是否正确——重命名时不小心改了父类名称的情况并不少见,这会导致你调用的
super并非预期的父类。
- 检查参数的nullable/nonnull修饰符:比如父类方法可能是
彻底清理项目缓存后重建
Xcode的缓存经常会在重命名操作后保留旧的方法元数据,导致运行时逻辑混乱:- 按
Cmd+Shift+K清理项目 - 按
Cmd+Option+Shift+K清理构建文件夹 - 手动删除DerivedData文件夹(路径:
~/Library/Developer/Xcode/DerivedData) - 重启Xcode后重新构建运行
- 按
检查运行时方法篡改逻辑
- 如果项目里有Category或者Runtime Swizzling代码修改了
sceneDidConnectWithOptions:,重命名操作可能让这些代码失效或逻辑混乱——比如Swizzle代码还在引用旧的方法名,导致方法调用链断裂。 - 用LLDB调试确认:在崩溃行打断点,输入
po [super class]确认父类是否正确;再输入po [super methodSignatureForSelector:@selector(sceneDidConnectWithOptions:)],把输出的签名和子类的对比,看是否完全一致。
- 如果项目里有Category或者Runtime Swizzling代码修改了
排查ARC/MRC混合场景的内存标记问题
如果项目里存在MRC文件,重命名方法时可能没同步内存管理标注(比如父类方法有NS_RETURNS_RETAINED这类标记),子类的方法缺少对应标注会导致运行时参数处理异常,触发崩溃。
内容的提问来源于stack exchange,提问作者Z X
相关产品推荐
相关产品推荐

