美文网首页
定位Unrecognized Selector Sent to

定位Unrecognized Selector Sent to

作者: 李华光 | 来源:发表于2017-01-12 15:17 被阅读0次

    前言

    出现unrecognized selector sent to instance问题,大部分是因为对象被提前释放,指针变成野指针,还有一种情况是本身就是野指针,如声明一个局部对象,没有初始化就直接调用。定位难的原因是你知道这个野指针指到哪个类了,但是不知道是哪里产生了野指针。如果一个正常的对象调用一个不存在的方法,也会给出这个提示,不过这种情况下Xcode会直接给出crash的代码行,不存在定位难的问题。

    方法一

    有时读代码一下很难找到是哪个instance出的问题,这时定制有效的DEBUG断点是最好的办法,方法如下:
    Debug菜单中选择 Breakpoints -> Create Symbolic Breakpoint

    Symbol中填写如下方法签名:
    -[NSObject(NSObject) doesNotRecognizeSelector:]

    然后再运行复现错误时断点会停在真正导致崩溃的地方。

    方法二

    如果提示[MyClass size] unrecognized selector sent to instance
    假设MyClass没有size这个方法,是什么让MyClass调用这个方法呢?正常是不会调用这个方法的,那么不妨逆向思考一下,既然它没有,我如果给它加上一个呢?
    于是,可以在MyClass中加了一个这样的方法:

    - (CGSize)size {
        NSLog(@"test");
        returnCGSizeZero;
    }
    

    在其中的NSLog行加上断点,运行工程,果然就找到了调用该方法的代码行,问题迎刃而解。

    需要注意的是,上面的代码你拿过去并不一定能复现同样的问题,可能就不会发生crash了,这里只是提供另一种解决思路.

    参考:

    相关文章

      网友评论

          本文标题:定位Unrecognized Selector Sent to

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