到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
来源:互联网 发布:python 计时功能 编辑:程序博客网 时间:2024/05/16 11:32
Objective C 的 Block
是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发、异步任务。但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle
)—— Block 会 retain ‘self’,而 ‘self‘ 又 retain 了 Block。因为在 ObjC 中,直接调用一个实例变量,会被编译器处理成 ‘self->theVar’,’self’ 是一个 strong 类型的变量,引用计数会加 1,于是,self retains queue, queue retains block,block retains self。
解决 retain circle
Apple 官方的建议是,传进 Block 之前,把 ‘self’ 转换成 weak automatic 的变量,这样在 Block 中就不会出现对 self 的强引用。如果在 Block 执行完成之前,self 被释放了,weakSelf 也会变为 nil。
示例代码:
<span class="line-number" style="font-size: 16px;">1<span class="line-number">2<span class="line-number">3<span class="line-number">4</span></span></span></span>
__weak __typeof__(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [weakSelf doSomething];});
clang 的文档表示,在 doSomething 内,weakSelf 不会被释放。但,下面的情况除外:
<span class="line-number" style="font-size: 16px;">1<span class="line-number">2<span class="line-number">3<span class="line-number">4<span class="line-number">5</span></span></span></span></span>
__weak __typeof__(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [weakSelf doSomething]; [weakSelf doOtherThing];});
在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成,调用第二个方法 doOtherThing 的时候,weakSelf 有可能被释放,于是,strongSelf 就派上用场了:
<span class="line-number" style="font-size: 16px;">1<span class="line-number">2<span class="line-number">3<span class="line-number">4<span class="line-number">5<span class="line-number">6</span></span></span></span></span></span>
__weak __typeof__(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ __strong __typeof(self) strongSelf = weakSelf; [strongSelf doSomething]; [strongSelf doOtherThing];});
__strong
确保在 Block 内,strongSelf 不会被释放。
总结
- 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
- 如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
0 0
- 【IOS学习】到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
- 在Block中使用weakSelf与strongSelf的意义
- 在Block中一起使用weakSelf与strongSelf的含义
- OC的Block中使用weakSelf/strongSelf
- iOS block中weakSelf和strongSelf的使用(分别什么时候用)
- [转载]OpenGL超级宝典笔记——GLSL语言基础
- linux杂记1
- halcon学习笔记(1) 图像预处理
- JAVA深入研究——Method的Invoke方法
- 在字符串(字母)中找出第一个只出现一次的字母
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- Android 常用控件的信息
- dubbo服务笔记一
- C++string读入问题
- Eclipse Debug模式的开启与关闭
- 存储过程
- 如何给Ubuntu 安装Vmware Tools
- MFC: 自制室内pm2.5检测仪
- JQuery中的 $.ajax 的使用