Unrecognized Selector Sent to Instance问题之诱敌深入关门打狗解决办法

?

MAY 17TH, 2014

前不久在微博上看到一篇文章,《UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法》?其中讲了iOS unrecognized selector sent to instance问题的快速定位方法,方法是不错的,但是实际测试发现文中的方法并非万能,从我自身的经历以及文中的评论看都有不能解决的情况。

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

我遇到这个问题的情况是这样的:写的代码一直在iOS7下进行调试,运行得好好的,最近想测试一下iOS6的兼容性,结果登录成功后就会产生crash,提示[NewsViewController size] unrecognized selector sent to instance,看到这个问题当时真是相当莫名其妙,NewsViewController无论如何都不可能有size这个方法,是什么让NewsViewController调用这个方法呢?

在Xcode中用size关键词搜索所有调用size的地方一个个排除?别逗了,代码里多的是。想象一下,你在iOS7下写好了全部代码,然后在iOS6下测试兼容性时出现此问题,面对茫茫如海的代码,足够让你望洋兴叹了,一个个去找,费不起那功夫。

想起来上面那篇文章中的方法,结果是毫无帮助,下断点无效。

只得再另想办法。要快速定位问题代码行,主要思路还是得下断点,还有没有别的办法下断点呢?这个时候可就要在“unrecognized selector sent to instance”的提示上做文章了,这个提示的实际意义是某个对象调用了不存在的方法。不妨逆向思考一下,既然它没有,我如果给它加上一个呢?这不下断点的机会就来了——所谓诱敌深入,关门打狗,不过如此。

于是,我就在NewsViewController中加了一个这样的方法:

1
2
3
4
- (CGSize)size{ NSLog(@"test"); return CGSizeZero; } 

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

出错的代码也贴一下吧,简化一下大概就是下面这样的:

1
2
3
4
- (void)test{ UIImage *imgNormal, *imgSelected; NSLog(@"imagNormal width is %f", imgNormal.size.width); } 

问题出在NSLog的那一行,很显然,这就是没有初始化的局部对象在实际访问时出错,系统认为它是NewsViewController对象, 不再属于UIImage类了。

需要注意的是,上面的代码你拿过去并不一定能复现同样的问题,可能就不会发生crash了。这里只是提供另一种解决思路,希望对遇到此问题的人有所帮助。

时间: 2024-11-06 12:36:39

Unrecognized Selector Sent to Instance问题之诱敌深入关门打狗解决办法的相关文章

出现“unrecognized selector sent to instance”问题原因之一及解决方法。

? 对于iPhone开发初学者来说,很想实现自己在iPhone上的第一个小程序,准备工作就绪侯就信心满满的开始了!一般来说大家可能都是从Hello World做起吧. 反正我是的,:),如果按照文档上的说明去做,一般也不会出现什么问题.也建议初学者这样开始,毕竟会增强我们自己的信心. 但是当我们自己独立去做一个Button实现响应事件的小程序的时候,有时候确给我们出现了一点点小问题.也就是我题目所说的.下边我就列出出现此问题的 错误代码以及解决方式. code: [cpp] view plain

(未解决)[NSNull intValue]: unrecognized selector sent to instance 0x375c9860

今天遇到这个问题,程序崩溃了……日志如下: -[NSNull intValue]: unrecognized selector sent to instance 0x375c9860*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull intValue]: unrecognized selector sent to instance 0x375c9860' ***

UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法

开发中常见的一类崩溃错误是遇到:unrecognized selector sent to instance 0xaxxxx…而backtrace又无法明确说明错误在哪行代码,如何快速定位BUG呢? 有时读代码一下很难找到是哪个instance出的问题,这时定制有效的DEBUG断点是最好的办法,方法如下: 在Debug菜单中选择 Breakpoints -> Create Symbolic Breakpoint… 在Symbol中填写如下方法签名: 1 -[NSObject(NSObject)

[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错

今天接口由get换成post,我去改进行登录但出现了这个错误,首先出错先看能不能与服务器交互,能不能获得数据,其次,获得的数据是不是你想要的,记住,首先出错要想到是自己的问题,还有就是程序崩了要学会自己解决,打断点找原因,一步步跟,看是哪里出了问题 我这个问题一看就是拿了NSCFNumber类型和NSString类型做了比较,由于不会响应isEqualToString方法而报错,所以只要转换一下就可以了 NSString *factory_id = [NSString stringWithFor

利用objc的runtime来定位次线程中unrecognized selector sent to instance的问题

昨天遇到一个只有一行错误信息的问题: -[NSNull objectForKey:]: unrecognized selector sent to instance 0x537e068 由于这个问题发生在次线程,所以没有太有用的堆栈信息,而是只有简单的SIGABRT信息: 考虑到unrecognized selector sent to instance这类问题是由于向某个对象发送了未实现的消息,这个过程大致如下(图片摘自这里): 参考Objective-C的对象模型: struct objc_

unrecognized selector sent to instance

[iOS] Error Fixed : [__NSArrayI addObject:]: unrecognized selector sent to instance 当我创建了一个NSMutableArray 对象的时候 @property (nonatomic,copy)NSMutableArray *children; 然后通过addObject运行就会报错,[__NSArrayI addObject:]: unrecognized selector sent to instance 解决

__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance

同样是删除cell问题,帮我看看问题出现在哪,谢谢! 我的类文件myFile是继承UIViewController的(目的是为了能够在一个view里切换不同的tableView),在myFile.h中定义一个可变数组editContactsList,然而在IB里面添加了一个view,两个tableView,在下面方法里面报错(有注明具体位置)- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCell

iOS 程序报错:reason: [NSArrayI addObject:]: unrecognized selector sent to instance

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x4b17be0' 错误:NSArray 不能使用 addObject:方法.可能是在程序运行的过程中,NSMutableArray转为了NSArray. 解决方案:核查数组,看看是否在NSArra

iOS中的crash防护(一)unrecognized selector sent to instance

专栏开篇: 在开发的过程中,作开为发者我们经常会遇到崩溃,闪退的情况,而且崩溃,闪退的情况有很多种.如果是在开发测试过程中的话,我们可以及时进行分析修复,但是对于我们的KPI还是会一有定的影响的,给导领留下的印象不佳.而且定位crash仍然需要花费很多的时间.如果崩溃,闪退发生在线上,那么对我们公司的产品影响更大,对我们的影响也是大的不行,轻则挨骂,重则扣工资.而且线上crash难以追踪定位,相信大家都深有体会.如果有一种机制,能够将常见的大多数crash给屏掉蔽,不会crash,而且可以发送c