从app delegate检索managedObjectContext时崩溃

时间:2014-01-27 16:41:41

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

当我尝试在我的一个视图控制器中检索我的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

的地方

2 个答案:

答案 0 :(得分:5)

你似乎在这里有一个无限循环:

- (NSManagedObjectContext *) managedObjectContext {
    if (self.managedObjectContext != nil) {
        return self.managedObjectContext;
    }

self.managedObjectContext会转换为[self managedObjectContext],这是您刚输入的方法。所以你一遍又一遍地调用访问者。

您没有正确复制该示例。

其次,你真的应该使用依赖注入而不是像单身一样对待你的App Delegate。我强烈建议研究DI并采用这种设计模式。它会在以后为你节省很多痛苦。

更新1

它在哪里崩溃?什么代码行?是self.managedObjectContext = appDelegate.managedObjectContext;还是其他地方?在Xcode中你的断点在哪里?如果它在{0}}方法的代码行而不是内部触发,那么您的App Delegate就会出现问题(这是不可能的)。

答案 1 :(得分:0)

要查找崩溃类型,只需将此代码添加到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

}