Objective c 一般调试和[\uu nscfoolean objectForKey:]

Objective c 一般调试和[\uu nscfoolean objectForKey:],objective-c,Objective C,我的应用程序上了将近30节课。当我输入一个特定的vc时,我得到了上面的错误,但是十次中只有一次,所以我没有办法重现它。 我怎样才能以有效的方式调试它?通常我会使用NSLog一步一步地“调试”,但我相信您可以用更有效的方法来启发我 更新:我添加了问题行答案中建议的例外情况:NSString*card=[NSString stringWithFormat:@“%@-%@”,[[UserAccount sharedInstance]cardNumber],[tokenData objectForKey

我的应用程序上了将近30节课。当我输入一个特定的vc时,我得到了上面的错误,但是十次中只有一次,所以我没有办法重现它。 我怎样才能以有效的方式调试它?通常我会使用NSLog一步一步地“调试”,但我相信您可以用更有效的方法来启发我

更新:我添加了问题行答案中建议的例外情况:
NSString*card=[NSString stringWithFormat:@“%@-%@”,[[UserAccount sharedInstance]cardNumber],[tokenData objectForKey:@“CardPhoneToken”]

我仍在试图找出它的问题所在。

为抛出和捕获时的所有异常设置异常断点

这可以在“+”符号上断点导航器的右下角完成。添加异常断点。。。然后选择Break:On-Throw并为On-Catch创建另一个

这将创建一个断点,该断点将帮助您识别生成异常的位置



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

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

然后键入:

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
然后可以运行atos命令:

cd Contents/Resources/DWARF/
其中TestApp是您的应用程序名称,0x7556fb0是您要调查的地址。在您的情况下,可能是0x883012

有时,这可能会给你一个类和一个行号,说明车祸发生的地方。比如:

atos -arch armv7 -o TestApp 0x7556fb0



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

此异常应易于调试-搜索所有objectForKey:调用,并查看可以将其发送到哪里的布尔值

或者,如果此类调用的代码行太多,可以将调用堆栈符号化:
首先设置一个异常断点。 如果是这样的话,在异常出现的那一刻,它可能不会显示任何有用的输出。但是您应该看到代码的每一部分,它被抛出的地方。这很有帮助。 如果然后在调试器中按“continue execution”(继续执行),可能会按两三次左右,最终错误消息会出现在调试控制台中。到那时,可能会显示main函数,但到那时您已经看到了异常的起源

好的,现在我们来看一下在这行代码中处理的所有对象。 其中一个对象(或这些对象的任何属性)应该是NSDictionary,因为正如错误消息所告诉您的,已经发送了一条“objectForKey:”消息,但没有找到合适的选择器。这是因为所讨论的对象属于Boolean/NSBoolean类型

大多数情况下,你都会给一些数字对象或指针分配一些应该是NSDictionary的东西。 很可能您正在访问一个未初始化的指针,它恰好指向某种布尔类型的东西。在这种情况下,错误可能很难再现


然而,这样做会引导你走上正确的轨道

你似乎把NSNumber和NSDictionary混淆了。你可以解释一下为什么有人会为了未来的访问者做这样的事情。你能详细解释一下吗?我和objectForKey有160行,我有进展了!好的,这就是它停止的地方,
NSString*card=[NSString stringWithFormat:@“%@-%@”,[[UserAccount sharedInstance]cardNumber],[tokenData objectForKey:@“CardPhoneToken”]不幸的是,这里没有
NSNumber
NSDictionary
。显然
tokenData
应该是一个NSDictionary。至少它被发送到它无法响应的
objectForKey
选择器。在这之前把它记录在行中<代码>NSLog(@“%@”,令牌数据)tokenData
NSDictionary
我刚刚记录了
tokenData
。大多数时候,它返回一个包含项的字典,但当我得到错误时,它返回0。
[Class methodName:]; -211