1
#import "ViewController.h"

@implementation ViewController

int tnt=1;

-(void)myMethod{

    void(^blk)(void) = ^(void){
        tnt = 3+1;
        NSLog(@"tnt=>%d", tnt);
    };

    blk();
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self myMethod];
}

变量 tnt 在外面,但在里面,它工作得很好。如果我在 myMethod 中声明 tnt 变量,它开始给出 __block required 错误。

在这两种情况下, tnt 变量都在块之外。Apple 文档还说外部变量需要 __block 存储类型。为什么在 myMethod 之外声明 tnt 时它会起作用。

4

2 回答 2

1

我猜这与范围有关。从文档中:

使用 __block 存储修饰符声明的封闭词法范围的局部变量由引用提供,因此是可变的。任何更改都反映在封闭词法范围中,包括在同一封闭词法范围内定义的任何其他块。这些在“__block 存储类型”中有更详细的讨论。</p>

当您int tnt=1;超出词法范围时,我认为您不必使用__block修饰符。你有一个例子,here。您还可以阅读以下内容:

__block 变量存在于变量的词法范围和在变量的词法范围内声明或创建的所有块和块副本之间共享的存储中。因此,如果在帧内声明的块的任何副本在帧结束后仍然存在(例如,通过在某处排队以供以后执行),则存储将在堆栈帧的破坏中幸存下来。给定词法范围内的多个块可以同时使用一个共享变量。

由于在int tnt=1;词法范围之外声明,它将在堆栈的破坏中幸存下来。

于 2012-11-12T11:54:52.183 回答
0

不需要捕获全局变量。

于 2012-11-12T19:22:34.230 回答