iOS|iOS -[XX respondsToSelector:]: message sent to deallocated instance导致的闪退问题
问题产生的环境:iOS 版本11.2.6真机 7P,
问题描述:在点击地图时闪退,但不是每次是,是不是感觉很奇怪,但是闪退时,没有任何日志信息,加全局断电,也不起作用,直接跳到
文章图片
接下来一步一步解决,既然断点没出来,只能第一步看日志了
文章图片
文章图片
通过日志中内容了解到是给可能已经释放的对象发送消息 导致的,那接下来就用xcode的自带的调试工具设置
文章图片
设置 Zombie objects调试的原理是向已经释放的对象,类似于设置成其他的对象,如果向这个已经释放的对象发送消息时,就会拦截出错误信息来,这样我们就可以分析什么原因导致的了
[XXViewController respondsToSelector:]: message sent to deallocated instance 0x11abce0b0
这是拦截的错误信息,接下来分析了
看到这个错误消息时,首先,就是 XXViewController的这个对象已经释放,给他发respondsToSelector:才引起的报错
其次,就是可以看出XXViewController 是某个对象的代理对象,因为XXViewController里有
UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
webView.delegate=self;
看一下webview的delegate的属性修饰是assign
1.不是强引用, 不能保住OC对象的命
2.如果引用的OC对象销毁了, 指针并不会被自动清空, 依然指向销毁的对象(很容易产生野指针错误: EXC_BAD_ACCESS)
而当这个XXViewController 销毁时 webView.delegate 的指针没有置nil 导致给释放对象 发消息报错,
解决办法1,如果是自己定义的控件代理,可以设置代理的属性为weak;
【iOS|iOS -[XX respondsToSelector:]: message sent to deallocated instance导致的闪退问题】2,系统的控件比如 UIWebView *webView的代理属性是assign 就必须在XXViewController中的- (void)dealloc方法中置空webView.delegate指针,来避免野指针问题。
推荐阅读
- iOS-HIG|iOS-HIG 用户交互-可访问性
- iOS-底层探索12(dyld和objc的关联分析(类的加载上))
- iOS11界面设计规范|iOS11界面设计规范,附加iOS11所有控件PSD(最新资源片)
- ios|ios framework真机和模拟器合并
- iOS|iOS 过滤空格和换行符
- iOS|iOS 打包测试
- iOS|iOS 后台金额播报(类似支付宝 收款金额播报)
- iOS自定义默认的文件头注释
- iOS|iOS 设置导航栏的返回按钮只保留箭头
- iOS|iOS - 消息流程之动态方法决议 & 消息转发