在使用block时,会出现循环引用的问题。当block对象是属于当前对象本身时,如果再在block中使用当前对象的属性时,就会引起循环引用。
eg: self.theBlock = ^{
[ self.showBtn setTintColor:[UIColor clearColor]];
}//此处会有循环引用,编译器会提示警告 Capturing 'self' strongly in this block is likely to lead to a retain cycle
此时,weakself 就会派上用场,代码修改如下:
typeof(self) ___weak weakSelf = self;
self.theBlock = ^{
[ weakSelf.showBtn setTintColor:[UIColor clearColor]];
}
不再有编译警告。
总结:在使用block时,如果当前block被当前对像直接或间接持有的时候,在block体中再引用当前对象,要通过使用weakself 来引用。
另外,在使用GDC异步调用时,是不需要weakself的。
dispatch_async(........){
self.name = @"";//可直接使用self
}
网友评论