iOS -[XX respondsToSelector:]: message sent to deallocated instance导致的闪退问题

问题产生的环境:iOS 版本11.2.6  真机 7P,

问题描述:在点击地图时闪退,但不是每次是,是不是感觉很奇怪,但是闪退时,没有任何日志信息,加全局断电,也不起作用,直接跳到

接下来一步一步解决,既然断点没出来,只能第一步看日志了

iOS -[XX respondsToSelector:]: message sent to deallocated instance导致的闪退问题_第1张图片


通过日志中内容了解到是给可能已经释放的对象发送消息 导致的,那接下来就用xcode的自带的调试工具设置

iOS -[XX respondsToSelector:]: message sent to deallocated instance导致的闪退问题_第2张图片

设置 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  指针,来避免野指针问题。

你可能感兴趣的:(iOS -[XX respondsToSelector:]: message sent to deallocated instance导致的闪退问题)