如果我正在测试原因并绕过有问题的代码,为啥这个应用程序会崩溃?
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】:(来自我的评论:) 错误信息与谓词无关。
它告诉你NSManagedObjectContext
是nil
。
MR_contextForCurrentThread
方法可能存在问题
已弃用
并且不应再使用。原因是它假设每个线程都有一个唯一的 thread
托管对象上下文。这不再适用于新的 MOC 并发类型
在 GCD 队列上运行。
比较https://***.com/a/20536335/1187415。
最好使用MR_defaultContext
或将上下文从一个视图控制器传递到下一个。
【讨论】:
以上是关于如果我正在测试原因并绕过有问题的代码,为啥这个应用程序会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章