Objective-C块,递归失败

前端之家收集整理的这篇文章主要介绍了Objective-C块,递归失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
苏家伙,

我正在尝试做一个自我调用函数,但是把所有东西放在一个块上,

正如您所看到的,以下函数旨在被无限次调用(直到arcrandom返回低于50的数字),并且您应该期望作为输出可变数量的“RUNNING”消息,具体取决于偶然性.

  1. void (^_test_closure)(void) = ^ {
  2. NSLog(@"RUNNING");
  3. if(arc4random() % 100 > 50) {
  4. _test_closure();
  5. }
  6. };
  7.  
  8. _test_closure();

但是,在运行它时,我得到一个EXC_BAD_ACCESS错误,我发现的原因是,当代码试图在闭包内调用_test_closure时,它基本上指向无处.

有谁知道如何使上述代码工作?

解决方法

递归和块是棘手的.因为一个块捕获传入的所有变量,所以变量_test_closure尚未初始化(并且clang应该给你一个警告:

Block pointer variable ‘_test_closure’ is uninitialized when captured by block

).

有几种方法可以解决这个问题,但最明显的方法是最简单的是让块本身成为一个__block变量(@ H2CO3所说的).这允许块几乎是弱链接的,因此当您再次调用它时,它会被正确初始化.

你有另一个选择是使块成为全局或静态,如下所示:

  1. // outside of 'main',thus being a global variable
  2. void (^blockRecurse)(int) = ^(int level) {
  3. if (level < 0)
  4. return;
  5. NSLog(@"Level: %i",level);
  6. blockRecurse(--level);
  7. };
  8.  
  9. int main()
  10. {
  11. @autoreleasepool {
  12. blockRecurse(10);
  13. }
  14. }

这意味着它不会被块捕获,而是引用全局/静态变量,可以由所有代码同等地更改.

猜你在找的C&C++相关文章