1

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

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

我有很多代码和类,所以我不知道需要发布什么才能开始研究这个问题。如果有人可以就如何开始解决此问题给我一些指导,将不胜感激。ps如果还有什么需要发布的告诉我,我会编辑的。

4

4 回答 4

4

当您遇到unrecognized selector send to instance错误时,您必须检查您是否声明并实现了错误指出的方法,在您的情况下_isDecompressing。如果您的类上一切正常(该方法已声明并实现),那么请查看调用该方法的类类型,在您的情况下,NSString大多数情况下该类是错误的。

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

找到导致崩溃的行的一个好方法是启用异常断点。

于 2013-06-27T18:14:57.247 回答
1

此崩溃的最可能原因是您正在向对象的已释放实例发送消息 - 尝试在启用 NSZomie 的情况下运行您的应用程序 - 请参阅如何在 Xcode 4 中设置 NSZombieEnabled?

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

正如评论中所指出的,向释放的实例发送消息的方式会有所不同:

该对象被分配在内存中的某处——在一个页面上,它被分配器分成几部分——例如malloc。如果底层分配器已经将对象所在的页面返回给内核,则应用程序将崩溃且没有日志 (EXC_BAD_ACCESS)。

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

但是,如果您的初始对象占用的内存被介于两者之间的另一个对象占用,则运行时无法知道曾经有一个您打算调用方法的对象,因此出现unrecognized selector异常,因为对象所属是对象结构的一部分——isa指针。运行时没有(或可以)检查任何其他内容。对于运行时,向对象发送消息是一个有效的请求,但是,新对象上没有这样的方法。

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

当然,还有其他情况,例如对象将被其他数据覆盖,因此 isa 指针指向一个不存在的类,并且会像最初一样发生崩溃,因为操作系统将尝试取消引用一个地址在您的流程中无效。

于 2013-06-27T18:21:32.243 回答
0

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

于 2013-06-27T18:12:44.917 回答
0

如果您从 JSON 字典中提取图像名称并将其直接传递到需要UIImage; 由于未对值进行类型检查,编译器将错过错误,您将遇到运行时崩溃。

(问我怎么知道的!)

于 2020-04-10T23:04:37.893 回答