1

編集:このスレッドの元のタイトルは「2 番目のマネージド オブジェクト モデルの作成時にクラッシュする」でしたが、問題は解決され、問題は上記のタイトルのとおりであることが判明しました。

TL;DR:NSFetchRequests複数のNSManagedObjectContextオブジェクトで再利用しないでください。答えを参照してください。


NSEntityDescription の再利用がうまくいかないことに関連していると思われる問題が発生しています。

ユーザーごとに Core Data を使用し、ユーザーがログインおよびログアウトできるようにするアプリがあります。各セッションには、コア データ スタックと呼ばれるものがあり、マネージド オブジェクト モデル、ストア コーディネーター、および使用するコンテキスト階層をロードします。ユーザーがログアウトすると、スタックが解放され、モデル、コーディネーター、およびコンテキストが解放されます。ただし、ユーザーが再度ログインすると、クラッシュが発生します。ゾンビを有効にすると、次のようになります。

2014-04-30 11:31:50.755 CPiPhoneSSLVPN[65981:907] *** -[NSEntityDescription name]: message sent to deallocated instance 0x19888170

これは、フェッチを実行しようとするたびに発生します。私は Core Data スタックをいじり、モデルを静的にしました (オンデマンドで一度ロードされ、リリースされることはありません)。これは期待どおりに機能します。問題は、アプリが実行時にセキュリティ ポリシーに準拠するようにモデル エンティティを変更することです (たとえば、特定のプロパティを一時的にして、ディスクに保存されないようにします)。したがって、モデルを作成することは実行可能な解決策ではありません。

クラッシュのバックトレースは次のとおりです。

* thread #1: tid = 0x3c6736, 0x02793411 CoreFoundation`___forwarding___ + 769, name = 'Main', queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
  * frame #0: 0x02793411 CoreFoundation`___forwarding___ + 769
    frame #1: 0x027930ee CoreFoundation`__forwarding_prep_0___ + 14
    frame #2: 0x0319e71e CoreData`fetchPlanAllocateInitialize + 206
    frame #3: 0x0319e2e4 CoreData`-[NSSQLCore objectsForFetchRequest:inContext:] + 644
    frame #4: 0x0319ddcf CoreData`-[NSSQLCore executeRequest:withContext:error:] + 383
    frame #5: 0x0319d7f2 CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 4466
    frame #6: 0x0319af56 CoreData`-[NSManagedObjectContext executeFetchRequest:error:] + 566
    frame #7: 0x031efd86 CoreData`-[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] + 502
    frame #8: 0x0326da14 CoreData`__82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 676
    frame #9: 0x031efb81 CoreData`internalBlockToNSManagedObjectContextPerform + 17
    frame #10: 0x06c2d4d0 libdispatch.dylib`_dispatch_client_callout + 14
    frame #11: 0x06c1c439 libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 80
    frame #12: 0x06c2d4d0 libdispatch.dylib`_dispatch_client_callout + 14
    frame #13: 0x06c1b726 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 340
    frame #14: 0x0280843e CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14
    frame #15: 0x027495cb CoreFoundation`__CFRunLoopRun + 1963
    frame #16: 0x027489d3 CoreFoundation`CFRunLoopRunSpecific + 467
    frame #17: 0x027487eb CoreFoundation`CFRunLoopRunInMode + 123
    frame #18: 0x062335ee GraphicsServices`GSEventRunModal + 192
    frame #19: 0x0623342b GraphicsServices`GSEventRun + 104
    frame #20: 0x048ddf9b UIKit`UIApplicationMain + 1225
    frame #21: 0x0003b0e6 CPiPhoneSSLVPN`main(argc=1, argv=0xbfffed7c) + 86 at main.m:17

誰もこの種の問題を見たことがありますか?任意のヒント?

この問題のバグ レポート 16767152 を開きました。

4

1 に答える 1

2

問題は、キャッシュされた を使用していたことNSFetchRequestです。フェッチ要求は、コンテキストによる最初の使用時にエンティティを内部的にキャッシュし、後で再利用されると、単純にそのキャッシュを使用しようとするようです。これにより、上記のエラーが発生しました。

于 2014-04-30T17:36:51.220 に答える