'NSInvalidArgumentException',原因:' – :无法识别的select器

我有这个错误在Xcode中进行:

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

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

当你有unrecognized selector send to instance错误,你必须检查你是否声明和实现了错误指出的方法,在你的情况_isDecompressing 。 如果你的类一切都正常(方法被声明和实现),那么看看调用该方法的类types,在你的情况NSString大部分时间类是错误的。

所以为了指出你的问题,你正试图调用NSString上不存在的方法_isDecompressing 。 所以确保调用这个方法的每个对象都是你想要的types而不是NSString

find导致崩溃的行的一个好方法是启用exceptionbreackpoints。

这个崩溃最可能的原因是你发送一个消息到一个对象的释放实例 – 尝试运行与NSZomie的启用您的应用程序 – 请参阅如何在Xcode 4中设置NSZombieEnabled?

发生什么事情是当你的对象使用的内存被取消分配时被标记为未被使用,并且在那个地方被分配了一些其他的对象。 然而,这个对象是不同的类,因此不能识别select器消息。

正如在评论中指出的那样,发送消息到解除分配的实例的方式本身是不一样的:

该对象被分配到内存中的某个地方 – 在一个页面上,这个页面被一个分配器(如malloc)分成几部分。 如果底层分配器已经返回了对象到达内核的页面,那么应用程序将崩溃而不logging(EXC_BAD_ACCESS)。

如果该对象被释放,并且保留计数达到0,则释放该对象,这意味着将该页面上的内存标记为免费供将来使用。 如果您因此尝试向该对象发送另一个消息,则运行时将会注意到该对象没有保留计数,因此被解除分配,并且将message sent to deallocated instanceexception。

但是,如果初始对象占用的内存被另一个对象占用,则运行时无法知道曾经有一个对象打算调用方法,因此unrecognized selectorexception,因为类对象所属的是对象结构的一部分 – isa指针。 没有别的(或可以)运行时检查。 对于运行时,将消息发送给对象是一个有效的请求,但是新对象上没有这种方法。

如果新对象响应相同的消息,在一个类中执行某种致命操作,这可能是潜在的危险,因为如果该方法是有效的方法名,该方法实际上被调用了。

当然,还有其他的一些场景,例如对象会被其他数据覆盖,所以isa指针指向一个不存在的类,崩溃就像在第一位一样,因为操作系统会尝试去引用一个地址在您的stream程中无效。

在debugging器控制台中,使用“bt”获取回溯,然后反汇编回溯中的第一个地址,明显小于其他值…小值地址是您的代码。