迁移UIViewController后UIKitCore中UILabel drawTextInRect崩溃排查求助
排查迁移UIViewController后NSNull调用set选择器崩溃问题
崩溃场景与已排查信息
- 从旧App迁移的复杂VC,Xib定义的根视图包含两个StackView和一个UIView,根据
prepareForSegue传递的参数,动态加载三个自定义CollectionView中的一个 - 崩溃时机:
viewWillAppear()执行完成后,viewIsAppearing()结束、viewDidAppear()开始前 - 报错信息:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull set]: unrecognized selector sent to instance 0x7ff86002efd0' - 已完成排查:
UILabel.setText和UILabel.drawTextInRect符号断点未发现异常,最后一次drawTextInRect调用为填充subView[1]中的分段控件标签;Xib所有outlet连接正常;prepareForSegue参数传递正常
确定NSNull实例(0x7ff86002efd0)对应的调用源头
- 添加精准符号断点
在Xcode中新增符号断点,输入-[NSNull set:],崩溃触发时查看完整调用栈,定位哪个对象试图向NSNull实例发送set消息。 - LLDB控制台直接调试
崩溃触发后,在LLDB控制台执行以下命令:po 0x7ff86002efd0:查看该实例的基础信息bt all:打印所有线程的调用栈,找到触发该错误的业务代码上下文
- 排查KVO与关联对象
检查VC代码中是否使用KVO或objc_setAssociatedObject,确认是否存在将NSNull误设为监听对象或关联对象的情况。 - 检查CollectionView数据源绑定
重点排查动态加载的自定义CollectionView的cell、header/footer,确认是否有控件(如UILabel)被绑定到NSNull值(比如通过Xib的运行时属性而非代码setText赋值)。
进一步排查系统调用NSNull的深层问题
- 检查Xib的运行时自定义属性
打开迁移的Xib文件,逐个检查所有控件(尤其是分段控件、CollectionView相关控件)的User Defined Runtime Attributes,确认没有属性被错误设置为NSNull类型的值。 - 验证自动布局约束有效性
检查Xib中所有约束的First Item和Second Item,确保绑定的都是有效控件,没有关联到已释放对象或NSNull占位。 - 确认CollectionView的注册与复用逻辑
检查自定义CollectionView在新App中是否正确注册cell类/Xib,复用ID是否与代码匹配;复用池若存在错误对象,可能导致控件关联到NSNull。 - 启用Zombies工具
在Xcode Scheme中开启Zombie Objects选项,重新运行App,捕获是否存在已释放对象被当作NSNull调用的内存问题。 - 排查Swift与OC桥接异常
若VC为Swift代码,检查Xib中控件的桥接是否正常,比如Optional值是否被错误解包为NSNull,导致系统内部控件赋值时触发异常。
内容的提问来源于stack exchange,提问作者BlueskyMed
相关产品推荐
相关产品推荐

