0

iPhone Core Data コードの非常に悪質な問題をデバッグしようとしています。

セットアップは次のとおりです。Webサービスをポーリングし、その結果をNSNotificationメインスレッドに送信するために存在するスレッドがあります(userDict一連の文字列とNSNumbersで渡されます)。メイン スレッドに渡すために、Tim Hatcher の通知ライブラリを使用しています。

NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
   [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}

メイン スレッドは us​​erDict を受け取り、その値を抽出して新しい管理対象オブジェクトに挿入します。ここまでは順調ですね。

ただし、これで問題が発生しますが、すぐではありません。スレッドがその結果をメイン スレッドに送信し、新しいオブジェクトをコンテキストに保存した後、特定の一連の操作 ( 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];
}

何が得られますか???

4

2 に答える 2

2

つまり、問題は実際には管理対象オブジェクトに入るプロパティにありますよね? 保持が問題を修正する理由は、その辞書が決して解放されないためです。つまり、オブジェクトを過剰に解放しているものは何でもクラッシュせずに解放でき、最終的には不適切なポインターを含む辞書ができます (オブジェクトがリリースされました)。

Snow Leopard を使用している場合は、NSZombieEnabled をオンにして実行し、ObjectAlloc インストゥルメント ツールを使用してみてください。ゾンビが解放されたら、クリックして、オブジェクトが保持および解放されたすべての場所のリストを見つけることができます。

于 2010-01-28T02:22:15.563 に答える
0

オブジェクトを Dict から ManagedObject に追加する間、オブジェクトを保持する必要があるように思えます。通知を介して送信する前に保持を追加することは保持を超えていると思われますが、反対側に保持がないため、バランスが取れています。

于 2010-01-28T00:48:14.137 に答える