关于block的循环引用的问题
昨天 我碰到了一个关于循环引用的问题 想跟大家分享一下
我点全局的_btn 不可以进入到_btn的delloc方法中 而点击局部的btn却可以进入到btn的delloc方法中
为什么全局会产生循环引用
而局部的不会产生循环应用
其实局部的也会产生循环引用只是编译器没有检测到而已 全局的是:self -> _btn -> block ->self 局部的是:self -> view -> btn -> block -> self;
我点击全局的_btn 虽然按钮从view上移除了但是还有self的_btn指针指向这个按钮所以无法释放 从而进不去delloc这个方法中
而点击局部的按钮 按钮从view上移除 所以view的subviews数组里就没有指针指向btn 所以btn就可以得到释放了 从而就能进入dellloc这个方法了
接着我新添加了一个controller 点击按钮进入到这个控制器中 然后在新的控制器中创建这个按钮 点击按钮返回原先控制器
新控制器代码:
如果是这样 点击btn能不能释放掉呢 显然并不能 原因就是我上面说的 self -> view -> btn -> block -> self 循环引用了 controller和btn都释放不掉 但是可恶的是用instrument竟然检测不出内存泄漏!!!编译器也没有警告
所以大家以后使用block一定要小心了 最好还是老老实实的写下__weak typedef (self) weakSelf = self 如果想要看看有没有内存泄漏最好也还是写delloc看看有没有进入这个方法。