定位Unrecognized Selector Sent to Instance问题

前言

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

方法一

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

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

定位Unrecognized Selector Sent to Instance问题_第1张图片

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

方法二

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

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

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

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

参考:

  • http://www.jianshu.com/p/b00dd3bfc92e
  • http://wonderffee.github.io/blog/2014/05/17/solve-unrecognized-selector-sent-to-instance-problem/

你可能感兴趣的