Block 的使用及如何避免循环引用

2018-03-13  本文已影响0人  Kx_

一、Block的使用
我一般都是声明为一个属性来使用

typedef void(^CallBackBlock)(NSString *taskIdentifier);
@property (nonatomic, copy) CallBackBlock block;//需要拷贝到栈中
//使用
if (self.block) {
    self.block = ^(NSString *taskIdentifier) {
      //doSomething
    };
}
self.block();

二、避免循环引用
1、如果我们需要在block的方法体内使用self,我们一般都要重新建一个weakSelf来弱引用当前的self,为了避免self被提前释放,我们一般都需要在block的方法体内在定义一个strongSelf,strongSelf其实是一个局部变量,它的生命周期是在block的方法体结束后销毁,所以起到一种保证在block执行完之前,self不会被回收的效果,使得代码的稳定性提高,当block结束后,self也会被回收,不会造成循环引用。

if (self.block) {
    __weak __typeof__(self) weakSelf = self;
    self.block = ^(NSString *taskIdentifier) {
        __strong __typeof__(weakSelf) strongSelf = weakSelf;
        weakSelf.identifier = @"123";
    };
}
上一篇 下一篇

猜你喜欢

热点阅读