问题产生的环境: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;
2,系统的控件比如 UIWebView *webView的代理属性是assign 就必须在XXViewController 中的- (void)dealloc方法中置空webView.delegate 指针,来避免野指针问题。