这是我参与「第四届青训营 」笔记创作活动的的第9天。 整理了前段时间讲的变量捕获,有些新的理解。
变量捕获
值捕获➕名称引用(添加_block➕捕获对象属性)
一些🌰
- (void)changeValue {
int value = 1;
void (^oneBlock)(void) = ^{
NSLog(@"value = %d", value); // value1 = 1
};
//OC是值引用 只取了value的值 没有取对象 block捕获 脱离使用
value = 2;
oneBlock();
NSLog(@"value = %d", value); // value2 = 2
}
oneBlock在初始化的时候,按值捕获了value,而后,当value更改后,block内捕获的值并没有跟着一起变化;而value2处则是使用的改变后的变量。
- (void)changeValue {
__block int value = 1;
//_block关键字允许被修饰变量在block内部改变 名称引用
void (^oneBlock)(void) = ^{
NSLog(@"value = %d", value); // value1 = 2
value = 3;
};
value = 2;
oneBlock();
NSLog(@"value = %d", value); // value2 = 3
}
传入的变量前增加了一个关键字__block,这个关键字标志了该变量允许在block中被修改。这里block内部对于value的捕获是引用捕获,也就是说block中的value就是外部的value对象,因此对应值的改变也会同步,内外互相影响。
- (void)changeValue {
NSString *value = @"1";
void (^oneBlock)(void) = ^{
NSLog(@"value = %@", value); // value1 = 1
}
value = @"2";
oneBlock();
NSLog(@"value = %@", value); // value2 = 2
}
取了之前的指针的“值”,当value被重新赋值时,block捕获的是上一个指针值
@property (nonatomic, copy) NSString *name;
- (void)changeValue {
self.name = @"1";
void (^oneBlock)(void) = ^{
NSLog(@"value = %@", self.name); // value1 = 2
//oc是动态语言 捕获self 发送消息取name变量 只捕获了self对象
//self指针没变,在block向self发消息时,它能正确的找到变化后的值
}
self.name = @"2";
oneBlock();
NSLog(@"value = %@", self.name); // value2 = 2
}
\