从应用委托中检索 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 视图

尝试使用尚未从自身检索的数据后调用委托方法 didUpdateLocations - Xcode Swift

jQuery 事件委托未检索表内容

从照片库中获取图像名称

如何从 iOS 应用程序中删除场景委托?

Spring Security:如何从委托人那里获取详细信息?