使用递归块时EXC_BAD_ACCESS

Rit*_*its 7 iphone recursion cocoa-touch objective-c objective-c-blocks

我正在尝试使用块创建递归.它工作了一段时间,但最终它崩溃并给我一个糟糕的访问异常.这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

说明:我有一个Square具有BOOL 的类nuked.它还有一个adjacentSquares包含其他Squares 的NSArray .

我想检查一个正方形或其中一个"连接"方块是否被核化.

该数组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
Run Code Online (Sandbox Code Playgroud)

CRD*_*CRD 14

您需要__block打开Block,将声明更改为:

__block BOOL (^Block)(Square *square, NSMutableArray *processedSquares);
Block = ^(Square *square, NSMutableArray *processedSquares) {
Run Code Online (Sandbox Code Playgroud)

Block在块内引用变量()时,其当前值将被复制到块中.在您的代码Block中尚未给出值,因为您在赋值中构造块...

__block前缀经过变量引用您的块使得它的递归调用的时候- Block有一个值,引用它是用来获得值,递归调用就可以了.

我不知道为什么它对你来说根本没有__block- 对我来说是失败的.然而,使用修饰符,我可以递归至少10,000的深度 - 因此堆栈空间不是问题!