如果我正在测试原因并绕过有问题的代码,为啥这个应用程序会崩溃?

Posted

技术标签:

【中文标题】如果我正在测试原因并绕过有问题的代码,为啥这个应用程序会崩溃?【英文标题】:Why does this app crash if I'm testing for the cause and bypassing the offending code?如果我正在测试原因并绕过有问题的代码,为什么这个应用程序会崩溃? 【发布时间】:2014-03-09 14:21:16 【问题描述】:

我有这段代码试图获取某个键的所有记录:

//  if the apptObject.aApptKey is nil, skip it...
if(apptObject.aApptKey == nil)
    continue;  //  go to beginning and try again 

    //  using apptObject.aApptKey, get the client's name
NSPredicate *predicate =  ([NSPredicate predicateWithFormat:@"(aClientKey = %@)", apptObject.aApptKey]);
    clientInfo = [ClientInfo MR_findAllWithPredicate: predicate];

问题是我收到了这个错误(Crashlytics 提供):

致命异常:NSInvalidArgumentException +entityForName: nil 不是合法的 NSManagedObjectContext 参数搜索实体名称'ClientInfo'

要么不明白错误消息告诉我什么,要么我不明白如果我在 MR_findAll 之前测试 nil 会发生什么。请注意,所讨论的“密钥”完全相同相同,我只是使用约会密钥来获取客户的姓名。

有人能解释一下这是怎么发生的吗?

【问题讨论】:

错误信息与谓词无关。它告诉你 NSManagedObjectContext 是 nil。 当我有这个时怎么会这样:defaultContext = [NSManagedObjectContext MR_contextForCurrentThread]; 在 AppDelegate didFinishLaunchingWithOptions 中? (我不是在质疑您的评论,但我不明白它是怎么回事)我必须更改什么以便所有类都可以使用 AppDelegate 的默认上下文? 我不知道它是怎么发生的,但据我所知,MR_contextForCurrentThread 已被弃用,因为它与新的托管对象并发类型不“兼容”。 Martin R:请改写你的评论作为答案,这样我就可以关闭它并给你积分......谢谢...... S-D 【参考方案1】:

(来自我的评论:) 错误信息与谓词无关。 它告诉你NSManagedObjectContextnil

MR_contextForCurrentThread 方法可能存在问题 已弃用 并且不应再使用。原因是它假设每个线程都有一个唯一的 thread 托管对象上下文。这不再适用于新的 MOC 并发类型 在 GCD 队列上运行。 比较https://***.com/a/20536335/1187415。

最好使用MR_defaultContext 或将上下文从一个视图控制器传递到下一个。

【讨论】:

以上是关于如果我正在测试原因并绕过有问题的代码,为啥这个应用程序会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使完全发布我的应用程序仍显示为测试版?

如何绕过 Google reCAPTCHA 使用 Selenium 进行测试

绕过 Amazon Aws 上的跨域资源共享

WCF 单元测试

为啥后台线程中未处理的异常不会使应用程序域崩溃?

在 OCUnit 应用程序测试中绕过登录/身份验证