变量捕获 | 青训营笔记

79 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的的第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
}

\