美文网首页程序员
iOS -[XX respondsToSelector:]: m

iOS -[XX respondsToSelector:]: m

作者: 赤子知心 | 来源:发表于2018-04-04 11:14 被阅读150次

    问题产生的环境: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  指针,来避免野指针问题。

    相关文章

      网友评论

        本文标题:iOS -[XX respondsToSelector:]: m

        本文链接:https://www.haomeiwen.com/subject/fjjchftx.html