私のアプリはデータストレージにコアデータを使用し、データベース/モデルが互換性がない/壊れているなどのケースを処理するコードを追加しました。この場合、エラーメッセージが表示され、ユーザーにすべてのデータを消去してアプリを再起動するように指示するので、ユーザーは最初からやり直すことができます。iPhoneアプリケーションがアクティブな状態を辞めた後クラッシュする(コアデータワイプ後)
問題は、ストレージが削除されてユーザーがホームボタンを押した後にアプリがクラッシュすることです。コードを拭きマイことは次のようになります。
// destroy context
if ([__managedObjectContext hasChanges])
[__managedObjectContext rollback];
[__managedObjectContext release];
__managedObjectContext = nil;
// remove store
if (__persistentStoreCoordinator.persistentStores.count)
[__persistentStoreCoordinator removePersistentStore:[__persistentStoreCoordinator persistentStoreForURL:localURL] error:nil];
NSLog(@"retain count: %p %d", __persistentStoreCoordinator, __persistentStoreCoordinator.retainCount);
[__persistentStoreCoordinator release];
__persistentStoreCoordinator = nil;
は面白いので、リリースは上記目的をDEALLOCなり、
NSPersistentStoreCoordinator
のカウント1が保持されます。
ユーザが今homebuttonを押下すると、私はコンソールでこれを取得する:
*** -[NSPersistentStoreCoordinator retain]: message sent to deallocated instance 0x8345530
この例では、プリントアドレス0x8345530
上記のコードで放出NSPersistentStoreCoordinator
オブジェクトに等しいです。完全には、プレーン、新しい空のストレージ・ファイルを使用して、うまく再びコースワークのアプリの意志を再起動した後
(gdb) bt
#0 0x0178be1e in ___forwarding___()
#1 0x0178bce2 in __forwarding_prep_0___()
#2 0x0122c75e in -[_NSSQLCoreConnectionObsever _purgeCaches:]()
#3 0x00345a39 in __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0()
#4 0x017f0885 in ___CFXNotificationPost_block_invoke_0()
#5 0x017f07a8 in _CFXNotificationPost()
#6 0x0028a1aa in -[NSNotificationCenter postNotificationName:object:userInfo:]()
#7 0x005e6169 in -[UIApplication _handleApplicationSuspend:eventInfo:]()
#8 0x005ee8bd in -[UIApplication handleEvent:withNewEvent:]()
#9 0x005ef1f8 in -[UIApplication sendEvent:]()
#10 0x005e2aa9 in _UIApplicationHandleEvent()
#11 0x01e45fa9 in PurpleEventCallback()
#12 0x017f91c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__()
#13 0x0175e022 in __CFRunLoopDoSource1()
#14 0x0175c90a in __CFRunLoopRun()
#15 0x0175bdb4 in CFRunLoopRunSpecific()
#16 0x0175bccb in CFRunLoopRunInMode()
#17 0x01e44879 in GSEventRunModal()
#18 0x01e4493e in GSEventRun()
#19 0x005e0a9b in UIApplicationMain()
#20 0x000046fd in main (argc=1, argv=0xbffff63c) at main.m:24
:バックトレースは次のようになります。
上記のコードは私のアプリデリゲートサブクラスからである、とプロパティは次のように宣言されています
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
私はちょうどその時retaincount、どのように任意のオブジェクトがまだOLDストアコーディネータのインスタンスを使用することができますされて理解しない何明らかにゼロに達しましたか?私はこれまで、アプリケーションデリゲートクラスの外でこのオブジェクトにアクセスしたりアクセスしたりしません。
[編集]ただ、同様の結果が得楽器(ゾンビモード)、走っ:すでにバックトレースからわかるように
http://i41.tinypic.com/317ci91.jpg
を、いくつかのパージ・キャッシュ方式は、クラッシュを引き起こしています。それは何ですか、そして、それがゾンビのものではなく、新しいストアコーディネーターのインスタンスを使用するようにするにはどうすればいいですか?
retainCountは役に立たないです。それを呼び出さないでください。 – bbum