我正嘗試使用塊創建遞歸。它工作了一段時間,但最終崩潰,並給我一個糟糕的訪問異常。這是我的代碼:使用遞歸模塊時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);
解釋:我有一個Square
類具有BOOL nuked
。它也有一個包含其他方塊的NSArray adjacentSquares
。
我想檢查一個正方形或它的一個「連接」正方形是否被燒燬。
數組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
哦,呃,我不能相信我錯過了那個。認真。接得好。刪除了我的非答案(儘管如此,仍然不需要`__block`)。 – bbum 2011-01-31 07:22:05