前言
出现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了,这里只是提供另一种解决思路.
参考:
网友评论