ブロックを使用して再帰を作成しようとしています。しばらくは動作しますが、最終的にはクラッシュし、アクセス不良の例外が発生します。これは私のコードです:
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);
説明:Square
BOOLを持つクラスがありnuked
ます。また、adjacentSquares
他のSquareを含むNSArrayもあります。
正方形、またはその「接続された」正方形の1つが核兵器であるかどうかを確認したいと思います。
配列processedSquares
は、無限再帰を防ぐためにチェックした正方形を追跡するためのものです。
これを実行すると、(予想どおり)このブロックの呼び出しが多数実行されます。しかし、ある時点で、アクセス不良の例外が発生して最後の行でクラッシュします。
私もこれをコンソールで取得します:
アドレス0x1のメモリに
アクセスできませんアドレス0x1のメモリにアクセスできませんアドレス0x1のメモリに
アクセスできませんアドレス0x1のメモリにアクセス
できません
警告:呼び出しをキャンセルします-現在のスレッドのスタックの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