Blcok的使用

2019-05-16  本文已影响0人  齊同学

Block介绍

局部变量

局部自动变量,在Block中可被读取。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值,Block此时对局部变量只是做了值传递的操作。

static 修饰的全局变量

因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存地址读出,获取到的是最新值,而不是在定义时copy的常量

__block __weak __strong 这都是做什么的

__block 修饰的变量

某些场景下,我们需要在Block内部对外部变量进行修改。这时需要使用__block来修饰该变量实现在Block内部的修改,此时Block是复制其引用地址来实现访问的。

比较__weak 和 __strong

这边用AFN中的一段代码

__weak __typeof(self)weakSelf = self;

AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
    __strong __typeof(weakSelf)strongSelf = weakSelf;
    strongSelf.networkReachabilityStatus = status;
    if (strongSelf.networkReachabilityStatusBlock) {
        strongSelf.networkReachabilityStatusBlock(status);
    }
};

__weak

__weak typeof(self) weakSelf = self;

self.passValueBlock = ^(NSString *string){
    dispatch_async(dispatch_get_main_queue(), ^{
       weakSelf.pointView.startLabel.text = string;
   });
}

弱引用不会影响对象释放,当一个对象被释放是,所有指向它的弱引用会被置空,也避免出现野指针。

__strong

总结:weakSelf是为了Block不持有self,避免循环引用,而再声明一个strongSelf是因为一旦进入Block执行,就不允许self在这个执行过程中释放。Block执行完后这个strongSelf会自动释放,没有循环引用问题。

最后,使用Block时的注意事项

解决方法:
__weak typeof (self) weakSelf = self;
上一篇下一篇

猜你喜欢

热点阅读