明确,只要在block里边用到我们自己的东西,成员变量,self之类的,我们都需要将其拿出来,把它做成弱指针以便之后进行释放。
在ZPShareViewController这个控制器中,由如下代码:
ZPSettingItem *item = [[ZPSettingItem alloc]init];
item.option = ^{
vc.delegate = self;
};
这里的option就是一个block方法,它导致循环引用,出现内存泄漏,而解决循环引用出现的内存泄漏的方法是:必须得有一个引用是弱指针,只有这样才能在这个引用结束之后进行内存回收。所以我们需要将这一段中的最后的那一个引用变成弱指针。
解决这里的block,导致的内存泄漏我们可以采取下面的办法:
// __weak typeof(self)share = self;等同于 __weak typeof(ZPShareViewController)share = self 或者 __weak ZPShareViewController* share = self; 但是__weak typeof(self)share = self 的好处在于 以后如果别的地方用到这种类型的方法就可以直接将代码拿过去,进行利用。
// 这段代码的意思是:创建一个self类型的弱指针,将self赋值给它,这样我们就得到了一个self类型的弱指针。
__weak typeof(self)share = self;
ZPSettingItem *item = [[ZPSettingItem alloc]init];
item.option = ^{
vc.delegate = share; // 将一个弱指针赋值给他
};
注意:当我们发现使用__weak这种方式解决不了问题的时候可以尝试采用__unsafe_unretained typeof(self) selfVc = self; 这种方式可能会导致野指针,所以一般不建议采用,只有当上诉方法解决不了问题的时候才会采取这种方式进行创建。