1
2013-01-08 16:02:55.341 TodayApp[95470:14003] -[__NSCFBoolean objectForKey:]: unrecognized selector sent to instance 0x9b4964
2013-01-08 16:02:55.342 TodayApp[95470:14003] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFBoolean objectForKey:]: unrecognized selector sent to instance 0x9b4964'
*** First throw call stack:
(0x883012 0x20a2e7e 0x90e4bd 0x872bbc 0x87294e 0x7afc 0x234353f 0x2355014 0x23457d5 0x829af5 0x828f44 0x828e1b 0x2dcf7e3 0x2dcf668 0xfea65c 0x2679 0x2585)
libc++abi.dylib: terminate called throwing an exception

我的应用程序有近 30 个课程。当我输入特定的 vc 时出现上述错误,但十次中只有一次,所以我无法重现它。如何以有效的方式调试它?通常我使用 NSLog 一步一步地“调试”,但我相信你可以用更有效的方法来启发我。

更新:我已经添加了例外,如答案中的建议,这是有问题的行:NSString *card = [NSString stringWithFormat:@"%@-%@",[[UserAccount sharedInstance] cardNumber],[tokenData objectForKey:@"CardPhoneToken"]]; 我仍在试图找出它有什么问题。

4

3 回答 3

2

首先设置一个异常断点。如果是这样,则在抛出异常时它可能不会显示任何有用的输出。但是你应该看到你的代码,它被抛出的地方。这很有帮助。如果您随后在调试器中按“继续执行”,可能会按两到三下左右,最终错误消息会出现在调试控制台中。到那时,可能会显示主要功能,但到那时您已经看到异常的来源。

Ok, nownig that have a look at all objects that you are dealing with in that very line of code. One of these objects (or any property of these objects) is supposed to be an NSDictionary, because, as the error message tells you, an "objectForKey:" message has been send but no appropriate selector was found. That is because the object in question is of type Boolean/NSBoolean.

You have most probabyl assigned some numerical object or pointer to something that is supposed to be an NSDictionary. It may well be that you are accessing an uninitialized pointer which just happens to point to some boolean type of thing. In that case the error may be hard to reproduce.

However, doing so will guide you onto the right track.

于 2013-01-08T14:42:59.527 回答
0

为 throw 和 catch 上的所有异常设置异常断点。

这可以在 BreakPoint Navigator 右下角的“+”号上完成。添加异常断点...并选择 Break: On Throw 并为 On Catch 创建另一个

这应该会创建一个断点,以帮助您确定在何处生成任何异常。



更麻烦的方法是创建一个 dSYM 文件并运行一个 atos 命令。

这是通过归档您的项目来完成的。然后在管理器中右键单击存档并在查找器中显示。然后右键单击并显示包内容。将 TestApp.app.dSYM 复制到方便的位置并在终端中导航。

然后输入:

cd Contents/Resources/DWARF/

然后你可以运行 atos 命令:

atos -arch armv7 -o TestApp 0x7556fb0

其中 TestApp 是您的应用名称,0x7556fb0 是您要调查的地址。在您的情况下,这可能是 0x883012。

有时这可以为您提供崩溃发生位置的类别和行号。像:

[Class methodName:]; -211


有时似乎可行的另一种方法是为HockeyApp设置您的应用程序。通过这种方式,您可以将崩溃报告发送到 HockeyApp,您有时会获得更多详细信息。上传 dSYM 文件也很有帮助。

于 2013-01-08T14:23:05.313 回答
0

此异常应该很容易调试 - 搜索所有 objectForKey: 调用,并查看可以将其发送到布尔值的位置。

或者,如果此类调用的代码行数过多,则可以符号化调用堆栈: Symbolicating iPhone App Crash Reports

于 2013-01-08T14:25:43.920 回答