我正尝试使用块创建递归。它工作了一段时间,但最终崩溃,并给我一个糟糕的访问异常。这是我的代码:使用递归模块时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