如何在obj-c / iphone应用程序中读取“无法识别的选择器”错误日志

时间:2011-08-24 00:06:20

标签: iphone objective-c crash

我的应用中出现以下崩溃日志错误:

-[NSNull length]: unrecognized selector sent to instance 0x194adc8

我怎么读这个?这是否意味着:

  • 我向“NSNull”对象发送了“长度”消息?
  • 尝试在另一个类上调用选择器时,“NSNull”类中的“length”方法崩溃了?

此外,如果它是前一个选项,我如何获得堆栈跟踪以查看哪个函数导致此崩溃?该顶行是我日志中唯一的错误。

由于

5 个答案:

答案 0 :(得分:5)

门1

NSNull无法回复length

您可以查看NSNull的文档,了解是否属实。

如果不知道你的代码库在做什么,我不知道在哪里看,你必须在某个时候调用[NSNull null];来获取NSNull对象,或者你正在某个地方使用框架返回这个。

答案 1 :(得分:2)

这意味着您向NSNull发送了'length',而NSNull没有'length'功能。

启用NSZombies可能会对你有所帮助(它会保留被解除分配的对象,以便它可以告诉你你试图访问哪个对象)但我认为在这种情况下你可能在某个时候将对象设置为NSNull(或者它是从功能)。

无论如何打开NSZombies,转到Project>编辑Active Executable>参数选项卡>然后添加一个名为NSZombieEnabled的变量并将值设置为YES。确保在完成后将其关闭,因为它可能会导致内存问题。

答案 2 :(得分:1)

这意味着您使用Length方法计算字符串长度

像     如果([strText Length]> 0)     {     //在这做点什么----     }     其他     {     //在这里做点事 -     }

所以在上面的情况下 - strText是NSNull然后肯定会发生崩溃并且GDB将显示如下消息: [NSNull length]:无法识别的选择器发送到实例

如上所述,Null没有长度方法。

救援:  首先检查:         if((NSNull *)strText == [NSNull null])         {             return strText = @“”;         } 这将防止NSNULL崩溃

答案 3 :(得分:0)

僵尸在这种情况下无济于事。正如Paul.s所说,NSNull是一个有效的对象。应用程序停止时,您应该获得堆栈跟踪。您是否打开了调试器窗格?确保它是。我很确定Xcode 4总是在堆栈跟踪的异常上停止。如果由于某种原因你还没有看到它,如果你在(gdb)提示符下,你可以输入'bt'(backtrace)来获取跟踪。

答案 4 :(得分:0)

因为您正在比较NSNull类与长度之前检查

    if ([NSString *str isKindOfClass:[NSNull null]]){
       str=@"";
    }

然后检查str的长度。

它有效!thx