更新 2: MOC の割り当て解除と保存を同期する回避策を見つけました。更新されたプロジェクトを参照してください。 https://github.com/shuningzhou/MOCDadLock.git
注: より積極的に失敗させました。実際のデバイスで実行しないでください。
更新:この問題を示すサンプル プロジェクト。 https://github.com/shuningzhou/MOCDadLock.git
XCode 6.2: 再現できません。
XCode 6.3: 再現可能。
XCode 6.4 ベータ版: 再現可能。
==========================問題====================== =========
OSSpinLockLockSlow
XCode 6.3 にアップグレードした後、アプリがランダムにスタックしました。私たちのプロジェクトでは、 と を使用NSOperation
しNSOperationQueue
てサーバーからデータをフェッチし、コア データを使用してデータを永続化しました。
この問題は、これまで発生したことはありません。スタック トレースから、コードによって呼び出しが行われていないことがわかります。これのデバッグをどこから開始すればよいかわかりません。誰かがガイダンスを提供できますか?
前もって感謝します!
スタックトレースを見てください
編集:
を使用AFNetworking
しており、 のNSOperations
サブクラスですAFHTTPRequestOperation
。いくつかのカスタム プロパティを追加し、メソッドをオーバーライドしました-(void)start
。
- (void)start;
{
//unrelated code...
NSString *completionQueueID = [NSString uuid];
const char *cString = [completionQueueID cStringUsingEncoding:NSASCIIStringEncoding];
self.completionQueue = dispatch_queue_create(cString, DISPATCH_QUEUE_SERIAL);
//unrelated code....
[super start];
}
についてCore Data
は、thread-confinement
パターンに従っています。managed object context
スレッドごとに分離されており、コンテキストは static を共有していますpersistent store coordinator
。
編集2:
詳細: システムが複数のスレッドを同時に終了すると、この問題が発生することがわかりました。管理オブジェクト コンテキストをスレッド ディクショナリに格納し、スレッドが終了すると解放されます。
[[[NSThread currentThread] threadDictionary] setObject:dataManager forKey:@"IHDataManager"];
CPU 使用率は約 20% です。