从应用委托中检索 managedObjectContext 时崩溃
Posted
技术标签:
【中文标题】从应用委托中检索 managedObjectContext 时崩溃【英文标题】:Crash on retrieving managedObjectContext from app delegate 【发布时间】:2014-01-27 16:41:41 【问题描述】:所以当我尝试在我的一个视图控制器中检索我的 managedObjectContext 时,我收到了 EXC_BAD_ACESS(code=2...) 错误。
这是我的 getter 方法代码:
- (NSManagedObjectContext *) managedObjectContext
if (self.managedObjectContext != nil)
return self.managedObjectContext;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
[self.managedObjectContext setPersistentStoreCoordinator: coordinator];
return self.managedObjectContext;
这就是我尝试检索 managedObjectContext 的方式
QVAppDelegate *appDelegate = (QVAppDelegate*)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
这是 appDelegate 中的定义
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
我正在使用 ARC 并将此 tutorial's 代码转换为 ARC。
我似乎真的无法解决这个问题。
编辑:这是崩溃的地方http://i.imgur.com/1yOS7TM.png
【问题讨论】:
请提供更多上下文。就目前而言,代码本身不应导致异常,即使它有点“未定义”,因为属性managedObjectContext
也可能返回nil
(如果您的persistentStoreCoordinator 是nil
。但是,您很可能会得到使用此上下文时在其他地方出现异常:您应该注意使用 线程限制 并发模式返回 NSManagedObjectContext
时的后果。
问题是,即使我删除方法内部的代码并调用它,它仍然会崩溃,所以里面的内容并不重要。调用该方法只会使应用程序崩溃。
调试器是你的朋友 ;)
调试该代码,检查它在哪里崩溃
***.com/questions/18963937/… 可能你会在这里找到更好的东西,你的代码看起来不错。
【参考方案1】:
你这里似乎有一个无限循环:
- (NSManagedObjectContext *) managedObjectContext
if (self.managedObjectContext != nil)
return self.managedObjectContext;
self.managedObjectContext
转换为 [self managedObjectContext]
,这是您刚刚输入的方法。所以你一遍又一遍地调用访问器。
您没有正确复制该示例。
其次,您真的应该使用依赖注入,而不是将您的 App Delegate 视为单例。我强烈建议研究 DI 并采用该设计模式。以后会省很多痛的。
更新 1
它在哪里崩溃?哪一行代码?是self.managedObjectContext = appDelegate.managedObjectContext;
还是其他地方? Xcode 中的断点在哪里触发?如果它在该代码行触发,而不是在-managedObjectContext
方法的内部,那么您的应用程序委托有问题(这应该不可能)。
【讨论】:
好点,但似乎这不是这里的核心问题。我可以从方法中删除除返回之外的所有代码,但它仍然崩溃,所以是调用本身导致应用程序崩溃,而不是我相信的方法中的内容。 从该方法中删除self.
,再次运行并链接屏幕截图。我仍然不相信您的代码不是这里的核心问题。显示堆栈跟踪也会有所帮助。
“我可以从方法中删除除返回之外的所有代码,但它仍然崩溃” - 如果返回仍然是return self.managedObjectContext
,那么调用正如马库斯所描述的那样,从自身内部获取方法。
@Abizern 好的,已经解决了,现在我只需要:return managedObjectContext;它有效。
耐心点,我正要这样做。【参考方案2】:
要查找崩溃类型,只需在 AppDelegate.swift 中添加此代码
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
NSSetUncaughtExceptionHandler exception in
print("This is exception here ",exception)
print(exception.callStackSymbols)
return true
【讨论】:
以上是关于从应用委托中检索 managedObjectContext 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
watchOS - 如何从扩展委托更新 SwiftUI 视图