ブロックを使用して再帰を作成しようとしています。しばらくは動作しますが、最終的にクラッシュし、不正なアクセス例外が発生します。再帰ブロックを使用する場合のEXC_BAD_ACCESS
BOOL (^Block)(Square *square, NSMutableArray *processedSquares) = ^(Square *square, NSMutableArray *processedSquares) {
[processedSquares addObject:square];
if (square.nuked) {
return YES; // Found a nuked square, immediately return
}
for (Square *adjacentSquare in square.adjacentSquares) {
if ([processedSquares containsObject:adjacentSquare]) {
continue; // Prevent infinite recursion
}
if (Block(adjacentSquare, processedSquares)) {
return YES;
}
}
return NO;
};
__block NSMutableArray *processedSquares = [NSMutableArray array];
BOOL foundNukedSquare = Block(square, processedSquares);
説明:これは私のコードで私はBOOL nuked
を持ってSquare
クラスを持っています。また、他の正方形を含むNSArray adjacentSquares
もあります。
正方形か、その「接続された」正方形のいずれかが裸であるかどうかをチェックしたいと思います。
アレイprocessedSquares
は、無限再帰を防ぐためにチェックした四角形を追跡することです。
これを実行すると、(期待どおり)このブロックの呼び出しが多発しています。しかし、ある時点では、不正なアクセス例外を伴う最後の行でクラッシュします。私も、コンソールでこれを取得
:
は、アドレス0x1の
でメモリにアクセスすることはできませんアドレス0x1の
でメモリにアクセスすることはできませんが、アドレス0x1の
でメモリにアクセスすることはできませんアドレス0x1の
でメモリにアクセスすることはできません警告:現在のスレッドのスタック上でcall-objcコードをキャンセルすると、これは安全ではありません。
私はブロックと再帰に慣れていません。何か案は?
編集1
要求されたとして、バックトレース:
#0 0x00000001 in ??
#1 0x000115fb in -[Square connectedToNukedSquare] at Square.m:105
#2 0x00010059 in __-[Bot makeMove]_block_invoke_1 at Bot.m:94
#3 0x91f3f024 in _dispatch_call_block_and_release
#4 0x91f31a8c in _dispatch_queue_drain
#5 0x91f314e8 in _dispatch_queue_invoke
#6 0x91f312fe in _dispatch_worker_thread2
#7 0x91f30d81 in _pthread_wqthread
#8 0x91f30bc6 in start_wqthread
ああ、私はそれを逃したとは思わない。真剣に。良いキャッチ。私の無回答を削除しました(しかし、まだその配列に '__block'は必要ありません)。 – bbum
これは私のために働いた。ありがとうございました! – Rits
私はこのブロックで「ブロック」を強く捕まえることで警告を受けていましたが、保持サイクル*につながる可能性があります。解決策がここに表示されます:http://stackoverflow.com/questions/15638751/how-to-fix-capturing-block-strongly-in-this-block-is-likely-to-lead-to-a-reta – ishahak