次の行で完全に読み込まれる前に、アプリがクラッシュすることがあります。
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
メソッドが 2 回目に呼び出されたときに発生します。編集
表示されている最初の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]];
...
});
}
2 回目 (私の DeviceLinker クラスが私の checkInactiveLinks メソッドで非アクティブなリンクについてデータベースをチェックしようとしているときに時々クラッシュが発生するとき。このメソッドは での起動時に呼び出されますapplicationDidBecomeActive
:
-(void) checkInactiveLinks {
AppDelegate *theDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
[newMoc setPersistentStoreCoordinator:[theDelegate persistentStoreCoordinator]];
...
}
私が間違っている場合は修正してください。コードを読むと、persistentStoreCoordinator ゲッターが 2 回目に呼び出されたときに、__persistentStoreCoordinator が返され、新しいものを割り当てて初期化する必要はないと思います...
更新 2 if ステートメントのまったく同じ行で、これも時々取得します。
-[__NSCFDictionary _hasPrecomputedKeyOrder]: unrecognized selector sent to instance 0x7dd3770
更新 3
ビルド スキームを編集し、[診断] タブでゾンビとログの例外を有効にしました。なるほど-[NSPersistentStoreCoordinator unlock]: message sent to deallocated instance 0x8916090
。私のコードには明示的なロックがないことに注意してください。