如何使用Objective-c中的“__block”关键字?

时间:2011-09-07 17:42:23

标签: objective-c objective-c-blocks

刚刚注意到某些Objective-c代码中的__block关键字,如下所示:

// myString passed into the method
__block NSString *_myString = myString;

__block关键字如何改变上述代码的行为?

3 个答案:

答案 0 :(得分:6)

此变量修饰符使变量能够在块的范围内进行修改。

答案 1 :(得分:0)

只有上面的语句__block修饰符不会做任何事情。但是,在块的上下文中,__block允许在此方法中定义的块来变量变量。

__block NSString *myString = @"My string";
NSLog(@"myString: %@", myString);


dispatch_async(dispatch_get_main_queue(), ^{
    myString = @"My string changed.";
});

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"myString: %@", myString);
});

在此示例中,块可以将myString更改为指向新变量。通过引用传递变量是不合适的。如果我从myString的声明中删除__block修饰符,我会得到一个编译说明,"变量不可分配(缺少__block类型说明符)。

答案 2 :(得分:0)

它允许以下几点:

  1. 它允许将变量分配到捕获它的块内。
  2. 它允许块在创建块后查看变量值的更改。
  3. 在MRC下,复制块时,块不会保留对象指针类型的__block变量。