mji*_*awi 435 objective-c ios objective-c-blocks
__blockObjective-C 中的关键字究竟是什么意思?我知道它允许你修改块内的变量,但我想知道......
Dar*_*ust 530
它告诉编译器在块中使用它时,必须以特殊方式处理由它标记的任何变量.通常,也会复制块中也使用的变量及其内容,因此对这些变量所做的任何修改都不会显示在块之外.当它们被标记时__block,在块内部进行的修改也在其外部可见.
有关示例和更多信息,请参阅Apple的块编程主题中的__block存储类型.
这个重要的例子是:
extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
NSInteger localCounter = 42;
__block char localCharacter;
void (^aBlock)(void) = ^(void) {
++CounterGlobal;
++CounterStatic;
CounterGlobal = localCounter; // localCounter fixed at block creation
localCharacter = 'a'; // sets localCharacter in enclosing scope
};
++localCounter; // unseen by the block
localCharacter = 'b';
aBlock(); // execute the block
// localCharacter now 'a'
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,在调用块之前修改了localCounter和localCharacter.但是,在块内部localCharacter,由于__block关键字,只能看到修改.相反,块可以修改,localCharacter并且此修改在块外部可见.
Joe*_*Joe 27
@bbum在博客文章中深入介绍了块,并触及__block存储类型.
__block是一种独特的存储类型
就像静态,自动和易失性一样,__block是一种存储类型.它告诉编译器变量的存储将以不同方式进行管理.
...
但是,对于__block变量,块不会保留.您可以根据需要保留和释放.
...
对于用例,您会发现__block有时用于避免保留周期,因为它不保留参数.一个常见的例子是使用self.
//Now using myself inside a block will not
//retain the value therefore breaking a
//possible retain cycle.
__block id myself = self;
Run Code Online (Sandbox Code Playgroud)
通常,当您不使用__block时,该块将复制(保留)该变量,因此即使您修改了该变量,该块也可以访问旧对象.
NSString* str = @"hello";
void (^theBlock)() = ^void() {
NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints @"hello"
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您需要__block:
1.如果你想修改块内的变量并希望它在外面可见:
__block NSString* str = @"hello";
void (^theBlock)() = ^void() {
str = @"how are you";
};
theBlock();
NSLog(@"%@", str); //prints "how are you"
Run Code Online (Sandbox Code Playgroud)
2.如果要在声明块后修改变量,并且希望块看到更改:
__block NSString* str = @"hello";
void (^theBlock)() = ^void() {
NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints "how are you"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100090 次 |
| 最近记录: |