iOSUIiOS Developer

关于block的循环引用的问题

2016-04-13  本文已影响177人  chenhao

昨天 我碰到了一个关于循环引用的问题 想跟大家分享一下

我点全局的_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看看有没有进入这个方法。

上一篇下一篇

猜你喜欢

热点阅读