【问题标题】:Crash on retrieving managedObjectContext from app delegate从应用委托中检索 managedObjectContext 时崩溃
【发布时间】: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 时的后果。
  • 问题是,即使我删除方法内部的代码并调用它,它仍然会崩溃,所以里面的内容并不重要。调用该方法只会使应用程序崩溃。
  • 调试器是你的朋友 ;)
  • 调试该代码,检查它在哪里崩溃
  • stackoverflow.com/questions/18963937/… 可能你会在这里找到更好的东西,你的代码看起来不错。

标签: ios cocoa-touch core-data ios7 delegates


【解决方案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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多