iPhone Core Data コードの非常に悪質な問題をデバッグしようとしています。
セットアップは次のとおりです。Webサービスをポーリングし、その結果をNSNotification
メインスレッドに送信するために存在するスレッドがあります(userDict
一連の文字列とNSNumber
sで渡されます)。メイン スレッドに渡すために、Tim Hatcher の通知ライブラリを使用しています。
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
メイン スレッドは userDict を受け取り、その値を抽出して新しい管理対象オブジェクトに挿入します。ここまでは順調ですね。
ただし、これで問題が発生しますが、すぐではありません。スレッドがその結果をメイン スレッドに送信し、新しいオブジェクトをコンテキストに保存した後、特定の一連の操作 ( 1 つNSFetchRequest
または 2 つのリレーションシップの割り当てを含む) を実行できます。EXC_BAD_ACCESS
フェッチされた管理対象オブジェクトのプロパティ。
もう 1 つの面白い点は、問題を解決できることです。これを行うには、シングル[userDict retain]
をスレッド内に配置してNSNotification
から、メイン スレッドに投稿して管理対象オブジェクトに保存します。NSString
受信スレッドで値を受け取るとすぐに新しいオブジェクトを作成して、オブジェクトを互いにファイアウォールで保護しても問題ありません。それがなくてもクラッシュしretain
ます。
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[userDict retain]; // NOW THIS WORKS (???)
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
何が得られますか???