在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被释放的情况,这样很容易出现逻辑问题,甚至闪退。
网友评论