このコードは正常に動作します。dispatch_asyncを使用するとアプリがクラッシュする
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
[parser release];
dispatch_asyncを使用すると、EXC_BAD_ACCESSが表示されます。しかし、なぜ?
このコードは正常に動作します。dispatch_asyncを使用するとアプリがクラッシュする
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
[parser release];
dispatch_asyncを使用すると、EXC_BAD_ACCESSが表示されます。しかし、なぜ?
パーサーデリゲートが時期尚早にリリースされていないことを確認してください。パーサーはデリゲートへの弱い参照しか保持せず、パーサーが完了する前にデリゲートがdeallocされていると、パーサーがそのデリゲートメソッドを呼び出そうとしたときに不正なアクセスを取得します。
実際、[parser parse]の前に[parser release]が行われたのはその理由です。ブロックをキューにディスパッチした後(ブロックが実行を待つ)、[パーサの解放]が直ちに呼び出されます。 dispatch_asyncを使用する場合、ブロックの実行遅延があることに注意してください。
これは、[parser release]をブロックに入れてすべてが正常になる理由についても説明します。
私は[パーサーのリリース]をブロックに入れて、すべて正常です。 – Voloda2