'NSInvalidArgumentException',原因:' - [__ NSCFString _isDecompressing]:无法识别的选择器

时间:2013-06-27 18:07:48

标签: ios xcode

我在Xcode中发生了这个错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString _isDecompressing]: unrecognized selector sent to instance 0x71863b0'

我有相当多的代码和类,所以我不知道需要发布什么来开始查看这个问题。如果有人可以就如何开始解决这个问题给我一些指导,那将非常感激。附:如果还有其他需要发布的内容告诉我,我会编辑。

4 个答案:

答案 0 :(得分:4)

如果出现unrecognized selector send to instance错误,则必须检查是否声明并实现了错误指出的方法_isDecompressing。如果您的类上的所有内容都已正确(声明并实现了该方法),那么请查看调用该方法的类类型,在您的情况下NSString大多数情况下该类是错误的。

因此,为了指出您的问题,您试图在_isDecompressing上调用一个不存在的方法NSString。因此,请确保调用此方法的每个对象都是您想要的类型,而不是NSString

查找导致崩溃的行的一种好方法是启用异常breackpoints。

答案 1 :(得分:1)

此次崩溃的最可能原因是您正在向已解除分配的对象实例发送消息 - 尝试在启用NSZomie的情况下运行您的应用程序 - 请参阅例如How do I set up NSZombieEnabled in Xcode 4?

接下来发生的事情是,对象使用的内存在解除分配时被标记为未使用,并且在该位置分配了一些其他对象。但是,此对象属于不同的类,因此无法识别选择器消息。

正如评论中所述,向已解除分配的实例发送消息的方式各不相同:

对象被分配在内存中的某个地方 - 页面上,由分配器分成几部分 - 例如malloc的。如果底层分配器已经返回了对象所在的页面,则应用程序将崩溃而没有日志(EXC_BAD_ACCESS)。

如果对象已被释放且保留计数达到0,则会被取消分配,这意味着只需将页面上的内存标记为空闲以供将来使用。如果您因此尝试向该对象发送另一条消息,则运行时将注意到该对象没有保留计数,因此被解除分配并将出现message sent to deallocated instance异常。

但是,如果初始对象占用的内存被其中的另一个对象占用,那么运行时无法知道曾经有一个对象打算调用方法,因此{{1}异常,因为对象所属的类是对象结构的一部分 - unrecognized selector指针。运行时没有(或可以)检查其他内容。对于运行时,它是向对象发送消息的有效请求,但是,新对象上没有这样的方法。

如果新对象响应同一个在一个类中执行某些致命事件的消息,这可能会有危险,因为如果该方法是有效的方法名称,则实际调用该方法!

当然,还有其他情况,例如该对象将被其他数据覆盖,因此isa指针指向一个不存在的类,并且崩溃将发生在第一个位置,因为操作系统将尝试取消引用在您的进程上下文中无效的地址

答案 2 :(得分:0)

在调试器控制台中,使用'bt'获取回溯,然后反汇编回溯中的第一个地址明显小于其他值......小值地址就是你的代码。

答案 3 :(得分:0)

如果您从JSON字典中拉出图像名称并将其直接传递到需要UIImage的内容中,这很容易实现。由于未对值进行类型检查,因此编译器将忽略该错误,并且会导致运行时崩溃。

(问我我怎么知道!)