#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所需的错误。
在这两种情况下,tnt变量都在块之外。 Apple文档还说变量外部需要__block存储类型。当tnt在myMethod之外声明时,为什么它工作。
答案 0 :(得分:1)
我猜这与范围有关。来自文档:
用声明的封闭词法范围的局部变量 __block存储修饰符由引用提供,因此是可变的。任何更改都会反映在封闭的词法范围中,包括 在相同的封闭词法范围内定义的任何其他块。 这些将在“__block存储类型”中详细讨论。
当你将int tnt=1;
置于词法范围之外时,我认为你不必使用__block
修饰符。你有一个例子here。您还可以阅读以下内容:
__块变量存在于变量的词法范围与声明的所有块和块副本之间共享的存储中 在变量的词法范围内创建。因此,存储将 如果块的任何副本,则在堆栈帧的破坏中存活 在框架内声明超出框架的末尾(for 例如,通过在某处加入队伍以便以后执行)。多 给定词法范围内的块可以同时使用共享 变量
由于int tnt=1;
被声明在词法范围之外,它将在堆栈被破坏后继续存在。
答案 1 :(得分:0)
不需要捕获全局变量。