调试 iphone 应用程序 - 崩溃,无法识别的选择器发送到实例



当我启动这个iPhone应用程序时,在输出控制台中抛出此错误:

-[__NSCFString stringValue]: unrecognized selector sent to instance 0x548ad0

并因此线程杀戮而崩溃:

libsystem_kernel.dylib`__kill:
0x360c0840:  mov    r12, #37
0x360c0844:  svc    #128
>> 0x360c0848:  blo    0x360c0860                ; __kill + 32

调试此问题的最佳方法是什么,以便我可以看到问题在代码中的位置?

选择断点导航器,这是 Xcode 导航栏(位于屏幕左侧)上的倒数第二个选择。

左下角有一个 + 号,单击并选择"添加异常断点"。 勾选异常断点,异常:全部,中断:抛出时,操作:添加操作。 (无论如何,这应该是默认选择)。 单击"添加",程序现在应停止在发生异常的位置。

您正在尝试NSString对象上调用stringValue方法。这是行不通的。您没有发布任何代码,但我假设您这样做:

NSString *str1 = <#you get your string from somewhere#>;
NSString *str2 = [str1 stringValue]; //crash

若要本地化崩溃,请设置异常断点或仅在项目中查找stringValue调用。

1) 在 Xcode 中,使用 Breakpoint Navigator 在 Objective-C 异常上设置断点。

2)寻找您使用stringValue的地方,并检查您使用的对象类型是否正确。 (它说你已经用字符串调用了它;它应该是别的东西,也许是一个NSNumber?)

3)启用僵尸,以防您认为收到stringValue消息的东西已被提前释放。

错误消息

"无法识别的选择器发送到实例 XXX"表示应用正在尝试调用不存在的方法。发生这种情况通常是因为该方法被调用到错误的对象上。在这里,有问题的对象是 NSString(位于内存地址 0x548ad0),方法是 stringValue:

找出此错误在代码中发生的位置。您需要找到源文件的名称和行为异常的行号。您可以使用调用堆栈(也称为堆栈跟踪或回溯)执行此操作。

如果我们保留断点,每当应用程序崩溃时,Xcode 窗口的左窗格都会切换到调试导航器。它显示应用中处于活动状态的线程,并突出显示崩溃的线程。

相关内容

最新更新