我的应用程序有时会在以下行完全加载之前崩溃:
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
这个 if 状态所在的完整方法如下所示(我认为这是非常标准的):
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
更新
崩溃发生在第二次-(NSPersistentStoreCoordinator *)persistentStoreCoordinator
调用该方法时。编辑
从第一个可见的 viewController 调用它的第一次时间:
- (void)updateStats {
NSLog(@"Updating stats");
dispatch_queue_t request_queue = dispatch_queue_create("updateNumberOfSchedules", NULL);
dispatch_async(request_queue, ^{
AppDelegate *theDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[theDelegate persistentStoreCoordinator]];
...
});
}
第二次(当我的 DeviceLinker 类将在我的 checkInactiveLinks 方法中检查数据库中的非活动链接时,有时会发生崩溃。此方法在启动时调用applicationDidBecomeActive
:
-(void) checkInactiveLinks {
AppDelegate *theDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
[newMoc setPersistentStoreCoordinator:[theDelegate persistentStoreCoordinator]];
...
}
如果我错了,请纠正我,但阅读我的代码我会认为第二次调用 persistentStoreCoordinator getter 时它应该返回 __persistentStoreCoordinator 而不是分配和初始化一个新的......
更新 2 在 if 语句的同一行,我也时不时得到这个:
-[__NSCFDictionary _hasPrecomputedKeyOrder]: unrecognized selector sent to instance 0x7dd3770
更新 3
我编辑了我的构建方案并在诊断选项卡下打开了僵尸和日志异常。现在我明白了-[NSPersistentStoreCoordinator unlock]: message sent to deallocated instance 0x8916090
。请注意,我的代码中没有任何显式锁定。