iOS中block详解 weakSelf , strongSelf

在block中避免循环引用

我们知道,在使用block的时候,为了避免产生循环引用,通常需要使用weakSelf和strongSelf.如:

__weak typeof(self) weakSelf = self;
    [self setBlock:^(int score) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        if(strongSelf){
            //.....
        }
    }];

什么时候在block中使用self,而不用使用weakSelf

当block本身不被self持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用weakSelf. ForExcemple:

[UIView animateWithDuration:0.45 animations:^{
        self.schoolName = @"ZJJ";
    }];

block持有了self,因为self不持有block,所以不产生循环引用,就不需要使用weakSelf。当动画结束是UIView会结束持有这个block,如果没有别的对象持有block的话,block就会被释放掉,从而block会释放掉对self的持有。整个内存引用关系被解除。

为什么有时候block里面需要引入strongSelf

在block中先引入一个strongSelf,是为了避免在block执行过程中,突然出现self被释放的情况,这样很容易出现逻辑问题,甚至闪退。

你可能感兴趣的:(iOS中block详解 weakSelf , strongSelf)