iOS 面试题(3.):为什么 weakSelf 需要配合 strong self 使用
来源:互联网 发布:淘宝买爱奇艺会员 编辑:程序博客网 时间:2024/05/20 22:41
问题
继续回答昨天的问题第二问。
我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码:
__weak typeof(self) weakSelf = self;[self doSomeBackgroundJob:^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { ... }}];
那么请问:为什么 block 里面还需要写一个 strong self,如果不写会怎么样?
|
|
|
|
|
|
|
| 思考时间,想好了请往下翻答案。
|
|
|
|
|
|
|
|
|
答案
在 block 中先写一个 strong self,其实是为了避免在 block 的执行过程中,突然出现 self 被释放的尴尬情况。通常情况下,如果不这么做的话,还是很容易出现一些奇怪的逻辑,甚至闪退。
我们以 AFNetworking 中 AFNetworkReachabilityManager.m
的一段代码举例:
__weak __typeof(self)weakSelf = self;AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) { __strong __typeof(weakSelf)strongSelf = weakSelf; strongSelf.networkReachabilityStatus = status; if (strongSelf.networkReachabilityStatusBlock) { strongSelf.networkReachabilityStatusBlock(status); }};
如果没有 strongSelf 的那行代码,那么后面的每一行代码执行时,self 都可能被释放掉了,这样很可能造成逻辑异常。
特别是当我们正在执行 strongSelf.networkReachabilityStatusBlock(status);
这个 block 闭包时,如果这个 block 执行到一半时 self 释放,那么多半情况下会 Crash。
这里有一篇文章详细解释了这个问题:https://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/
昨天的读者中,拓荒者 和 陈祥龙 同学在评论中也正确回答出了本题。
另外,还有读者提了两个有意思的问题,大家可以思考一下:
Yuen 提问:“数组” 和 “字典” 的
enumeratXXXUsingBlock:
是否要使用 weakSelf 和 strongSelf 呢?潇湘雨同学提问:block 里 strong self 后,block 不是也会持有 self 吗?而 self 又持有 block ,那不是又循环引用了?
- iOS 面试题(3.):为什么 weakSelf 需要配合 strong self 使用
- 为什么 weakSelf 需要配合 strong self 使用
- iOS 什么情况下weak self需要配合strong self使用
- iOS面试题 3. weakself和strongSelf的使用
- ios block中为什么要对weakSelf进行strong
- iOS 面试题~用@property声明NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- iOS面试题(2.)关于在block中使用weakSelf的讨论
- iOS weak & strong self
- IOS Q&A __weak typeof(self) weakSelf = self 是什么意思?
- _weak typeof(self) weakSelf = self使用解释
- Android面试题-为什么需要token
- iOS 面试题(6.):自己写的 view 成员,应该用 weak 还是 strong?
- 【IOS学习】到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- 什么时候需要使用事务管理机制? (面试题)
- iOS block何时可以不使用weakSelf
- IOS Block 的使用 weakSelf strongSelf
- 使用 __weak typeof(self) weakSelf = self 在代码块内部崩溃问题
- 面试题总结(配合java面试题库)
- Boss死亡解密地址
- NotImplementedError: No result backend is configured.
- linux 磁盘挂载
- JProfiler 9部署及使用
- C++中的头文件和源文件
- iOS 面试题(3.):为什么 weakSelf 需要配合 strong self 使用
- Ubuntu14.04 在chrome 安装使用SS过程详解
- 第十五周项目2--用哈希法组织关键字
- Linux makefile 教程 非常详细,且易懂
- 旋转数组的最小数字
- centos安装vim7.4
- 实现侧栏固定宽度,内容栏宽度自适应
- Ubuntu Navicat for MySQL安装以及破解方案
- EventBus使用