block 循环引用(2)
来源:互联网 发布:淘宝宝贝手机拍摄技巧 编辑:程序博客网 时间:2024/06/06 11:02
防止block与当前控制器循环引用解决办法:
__weak __typeof(self)weakSelf = self;
众所周知:
可是如果在这个block里面执行: removeObserver 方法时就会突然崩掉!!!!!
所有有问题找简书!!很强大的想你所想*****
解决办法:
在block实现中增加:
__strong __typeof(weakSelf)strongSelf = weakSelf;
strong typeof(weakSelf)strongSelf = weakSelf;就是解决这个问题的关键~先将强引用的对象转为弱引用指针,防止了 Block 和对象之间的循环引用。再在 Block 的第一句代码出将 weakSelf 的弱引用转换成 strongSelf 这样的强引用指针,防止了多线程和 ARC 环境下弱引用随时被释放的问题(因为强引用的引用计数至少为1)。
这里大家一定要有一个认识,weakSelf 位于 Block 的外面,strongSelf 位于 Block 的里面。从内存管理的角度来看,weakSelf 是要比 strongSelf 的声明周期要长的。这样就形成了从弱引用到强引用,再从强引用到弱引用的一种变化,也称作weak-strong dance。
MyViewController * __weak weakMyController = myController;
myController.completionHandler = ^(NSInteger result) {
MyViewController *strongMyController = weakMyController;
if (strongMyController) {
// ...
[strongMyController dismissViewControllerAnimated:YES completion:nil];
// ...
}
else {
// Probably nothing...
}
};
if (strongMyController) 是这段代码的亮点。之所以在 Block 的代码执行之前加上这样一个判断,就是为了防止在把 weakSelf 转换成 strongSelf 之前 weakSelf 就已经为 nil 了,这样才能确保万无一失。- block 循环引用(2)
- 详解Block: block循环引用
- block 使用小节(防止循环引用)
- 防止Block的循环引用(技巧)
- block解决循环引用(一)
- block解决循环引用(二)
- Block的循环引用
- block循环引用
- Block的循环引用
- block 防止循环引用
- block循环引用问题
- 循环引用的block
- block的循环引用
- block循环引用
- block循环引用问题
- block循环引用
- Block的循环引用
- Block的循环引用
- 【多线程开发】临界区实现原理
- qemu,kvm,vir-manager,virsh,libvirt相关内容
- 验证码总是失效问题
- 访问网络-------开源-Volley(Google亲儿子)
- iOS开发:button不能点击
- block 循环引用(2)
- 【Android】【绘图】Canvas类,Paint类
- JavaScript
- 剑指offer-面试题22:栈的压入、弹出序列
- 第1周 《C语言及程序设计》资料1——C语言中的运算符
- HttpClient的一些参数设置(想到线程的朋友进)
- codeblocks c++ 编译出错
- Android中 MVP模式的使用
- 单链表<br>java单链表的实现, 多线程 ,读写锁