浅谈Block传值-匿名函数(代码块)

时间:2024-06-22 15:36:20

block传值是从后往前传值---代理也是

// 使用block时, 不能访问self, 也不能直接访问属性, self.属性, 用self调用方法; 只要这样做了, block都会对其强引用一份, 也就是造成self对象引用计数+1;
    // 如何避免出现循环引用的情况: 1. 在MRC下, 使用__block 定义一个和self同样的指针, 让block弱引用; 2. 在ARC下 使用__weak
    //    __weak typeof(self)weakSelf = self;
    //    __weak DetailViewController *weakSelf = self;
    //    __block DetailViewController *weakSelf = self;
    // typeof(): 运算符; 这句话就是把weakSelf定义成self指向的数据类型(指针类型), 第一个self是规定weakSelf的类型, 第二个self是把weakSelf指向self;

#warning mark --第一步 定义block的类型属性
typedef void (^TSET)();
typedef void (^PassValue)(NSString *);

// 1. 确定要添加的block属性的数据类型 void (^)()
// 2. 定义block变量, 在内存修饰时使用copy, 因为block变量存放在栈区, 此时我们这个对象想持有一份, 使用copy就能把栈区的变量拷贝到堆区, 这样block就不会丢失;

系统开辟的是栈区一般 C语言,我们自己开辟的是堆区自己过来内存

#warning mark -- 第二步 定义block属性;
@property (nonatomic,copy)TSET testBlock;
@property (nonatomic,copy)PassValue passvalue;

#warning mark -- 释放block
    Block_release(_testBlock);
    Block_release(_passvalue);

浅谈Block传值-匿名函数(代码块)浅谈Block传值-匿名函数(代码块)

#warning mark -- 第三步push之前完成对block属性的赋值, 也就是确定block内部要做的事情;
    __block typeof (self)weakSelf = self;
    detail.passvalue = ^ (NSString *string) {
        weakSelf.alable.text = string;
    };

#warning mark -- 第四步block属性的调用
    self.passvalue(self.textField.text);