iOS 面试题(4.):block 什么时候需要构造循环引用
来源:互联网 发布:奇迹归来神臂进阶数据 编辑:程序博客网 时间:2024/05/21 00:55
问题
有没有这样一个需求场景,block 会产生循环引用,但是业务又需要你不能使用 weak self? 如果有,请举一个例子并且解释这种情况下如何解决循环引用问题。
|
|
|
|
|
|
|
| 思考时间,想好了请往下翻答案。
|
|
|
|
|
|
|
|
|
答案
需要不使用 weak self 的场景是:你需要构造一个循环引用,以便保证引用双方都存在。比如你有一个后台的任务,希望任务执行完后,通知另外一个实例。在我们开源的 YTKNetwork 网络库的源码中,就有这样的场景。
在 YTKNetwork 库中,我们的每一个网络请求 API 会持有回调的 block,回调的 block 会持有 self,而如果 self 也持有网络请求 API 的话,我们就构造了一个循环引用。虽然我们构造出了循环引用,但是因为在网络请求结束时,网络请求 API 会主动释放对 block 的持有,因此,整个循环链条被解开,循环引用就被打破了,所以不会有内存泄漏问题。代码其实很简单,如下所示:
// YTKBaseRequest.m- (void)clearCompletionBlock { // nil out to break the retain cycle. self.successCompletionBlock = nil; self.failureCompletionBlock = nil;}
总结来说,解决循环引用问题主要有两个办法:
- 第一个办法是「事前避免」,我们在会产生循环引用的地方使用 weak 弱引用,以避免产生循环引用。
- 第二个办法是「事后补救」,我们明确知道会存在循环引用,但是我们在合理的位置主动断开环中的一个引用,使得对象得以回收。
思考题
下期的问题是:weak 变量在引用计数为 0 时,会被自动设置成 nil,这个特性是如何实现的?
0 0
- iOS 面试题(4.):block 什么时候需要构造循环引用
- block 什么时候需要构造循环引用
- Ios 关于Block循环引用的面试题
- iOS 面试题~避免循环引用~解决方法
- 什么时候需要使用事务管理机制? (面试题)
- ios block循环引用问题
- ios block循环引用问题
- ios block循环引用问题
- ios block循环引用问题
- ios- block循环引用问题
- ios- block循环引用问题
- iOS block循环引用问题
- iOS Block循环引用检测
- iOS block之循环引用
- iOS面试题总结---block
- ios block 去循环引用 __weak
- ios-block循环引用简析
- ios Block解决循环引用和回传值
- UVA
- UVA725 - Division
- 关于H5中自定义属性的设置和获取
- daojishi
- 前端代码注释分类
- iOS 面试题(4.):block 什么时候需要构造循环引用
- Check that you do not already have another mysqld process
- ios UICollectionViewController集合视图(二)
- POJ 1322 Chocolate(母函数)
- 找出数组中只出现一次的元素
- linux服务器开发之网关服务器的实现
- Java并发编程(一):并发编程的挑战
- jQuery中li的前添加和后追加
- Codeforces 67C