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"]];
我还在试图弄清楚它有什么问题。
答案 0 :(得分:2)
首先设置一个异常断点。 如果是这样,则在发生异常时可能不会显示任何有用的输出。但是你应该看到代码的一部分,它被抛出的地方。这有很大帮助。 如果您在调试器中按“继续执行”,可能大概两三次左右,最终会在调试控制台中显示错误消息。到那时,可能会显示主要功能,但到那时你已经看到了异常的起源。
好的,nownig可以查看您在该代码行中处理的所有对象。 其中一个对象(或这些对象的任何属性)应该是一个NSDictionary,因为,正如错误消息所示,已发送“objectForKey:”消息,但未找到任何适当的选择器。这是因为有问题的对象是Boolean / NSBoolean类型。
你有大多数probabyl分配了一些数字对象或指向一个应该是NSDictionary的东西。 很可能是你正在访问一个未初始化的指针,恰好指向一些布尔类型的东西。在这种情况下,错误可能难以重现。
但是,这样做会引导您走上正确的轨道。
答案 1 :(得分:0)
为throw和on 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文件也很有帮助。
答案 2 :(得分:0)
应该可以轻松调试此异常 - 搜索所有objectForKey:调用,并查看将其发送到布尔值的位置。
或者,如果您使用此类调用的代码行太多,则可以对调用堆栈进行符号化: Symbolicating iPhone App Crash Reports