【问题标题】:Crash cause of [NSNull objectForKey:] but I can't find where[NSNull objectForKey:] 的崩溃原因,但我找不到在哪里
【发布时间】:2018-07-10 14:02:04
【问题描述】:

我的 iPhone 应用程序崩溃了,我有这个错误:

[724:95876] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull objectForKey:]: unrecognized selector sent to instance 0x1b5970878'

仅此而已。我不知道崩溃的确切位置。我正在进行的项目非常庞大,有什么方法可以详细了解objectForKeyNSNull 上的呼叫在哪里?

【问题讨论】:

  • 添加一个异常断点,你就会知道导致异常的确切代码行。
  • @iPeter,我刚试过,但断点停止在'return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));'
  • 您是否试图从任何响应字典或其他东西中获取任何值?如果没有关于问题的详细信息,很难知道究竟是什么问题。
  • 我知道这就是问题所在,他们有很多字典,我测试了代码中的所有“objectForKey”调用,但似乎没有一个崩溃。我做了这样的强制崩溃: NSDictionary *test = [NSNull null]; NSString *test2 = [test objectForKey:@"Test"];它做了完全相同的事情并且断点停止在它上面,这是否意味着错误在隐藏代码中的某个地方(例如一个 pod)?
  • 你能把你的代码贴在这里吗?

标签: ios objective-c crash nsdictionary nsnull


【解决方案1】:

您似乎正在从 Web 服务获取数据,如果是这样的话,一些值可能会以 null 的形式出现。始终尝试投射您的响应,并根据预期值进行评估

你可以像这样在定义头文件中设置一些宏方法,或者你可以定义近接口声明

//公式形成

 #define NULLVALUE(m)                    ((m == nil || m==[NSNull null]) ? @"" : m)
 #define NULLVALUESpace(m)                    ((m == nil || m==[NSNull null]) ? @" " : m)
 #define NULLVALUEflaot(m)                  ((m == nil || m==[NSNull null]) ? 0.0f : (float)m)
 #define NULLVALUEcolor(m)                    ((m == nil || m==[NSNull null]) ? @"ffffff" : m)
 #define NULLVALUEOut(m)                    ((m == nil || [m length]==0) ? @"" : m)
 #define NULLArray(m)                    ((m == nil || m==null) ? new NSArray : m)
 #define SET_IF_NOT_NULL(TARGET, VAL) if(VAL != [NSNull null]) { TARGET = VAL; }

然后您可以在代码中的任何地方使用它 喜欢

[NSString stringWithFormat:@"%@", NULLVALUESpace([Response objectForKey:key])];

【讨论】:

  • 我也是这么想的,不过目前不知道在哪里,这样的东西我不能尝试
  • @MathieuRobert 向我展示您从服务器获取的结果,因为此错误通常在您从服务器获取时出现,因为默认声明为 nil 而不是 null 所以我确定它来自您只需要的服务器以适当的方式进行响应
  • 我想要,不过好像是在一个Pod的框架里
【解决方案2】:

您是否在 XCode 中打开了“所有异常”断点?如果没有,请转到断点选项卡,然后在选项卡左下方的“+”菜单中选择异常断点。默认情况下,它应该设置为捕获所有 objc 并抛出异常。这样你的代码就会在崩溃发生的地方停止。

【讨论】:

  • 我做到了,但代码停止在'return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));'
  • 再按几次调试继续按钮,您应该会在控制台中看到更多信息。
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 2012-03-04
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多