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代码使此操作不安全.
我对块和递归并不熟悉.有任何想法吗?
根据要求,回溯:
#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的深度 - 因此堆栈空间不是问题!
| 归档时间: |
|
| 查看次数: |
3921 次 |
| 最近记录: |