block中的循环引用是这样的:某个对象有一个copy或者strong成员变量或者属性,这时block内部直接引用了成员变量或者self,这样就产生了self持有block成员,block成员持有self,就会导致循环引用。因为self本身就是一个strong类型的变量。
建议:在穿进block之前,先把self转换为weak automatic的变量;如下:
__weak typeof(self) we = self;
声明了一个self类型的weak指针,名字叫做weakSelf. typeof是用来求参数类型的,这里也就是来求self的类型。这样定义出的weakSelf就是和self是一个类型,并且是原self的一个弱引用。
这样在block中使用self或者self拥有的strong变量的时候就不会造成循环引用。
当然还有其他的解决方式:
#import "ViewController.h"
@interface ViewController ()
{
void(^blk_t)(void);
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//这种造成的循环是在block内使用了self,而self拥有blk_t
id __weak weakself = self;//解决的方式
blk_t = ^{
NSLog(@"===%@",weakself);
};
}
#import "ViewController.h"
@interface ViewController ()
{
void(^blk_t)(void);
}
@property (nonatomic, strong) id obj;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//这种造成的循环是在block内使用了obj
id __weak obj_ = _obj;
blk_t = ^{
NSLog(@"===%@",obj_);
};
}
当然还有其他的解决方式:
__block id obj_ = _obj;