iOS Block中的weakSelf/strongSelf
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。
示例代码:
1  | 
 | 
clang 的文档表示,在 doSomething 内,weakSelf 不会被释放。但,下面的情况除外:
1  | 
 | 
在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成,调用第二个方法 doOtherThing 的时候,weakSelf 有可能被释放,于是,strongSelf 就派上用场了:
1  | 
 | 
__strong 确保在 Block 内,strongSelf 不会被释放。
总结
- 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
 - 如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
 
参考
- I finally figured out weakSelf and strongSelf
 - Is the weakSelf/strongSelf dance really necessary when referencing self inside a non-retained completion called from a UIViewController?
 
原文作者: lslin
原文链接: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block/
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
iOS Block中的weakSelf/strongSelf的更多相关文章
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
		
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
 - ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
		
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
 - 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
		
转载,原文: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block ...
 - 【转载】在block中使用weakSelf/strongSelf
		
http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block/
 - ios block中引用self
		
__block __weak typeof(self) tmpSelf = self; ^(){ tmpSelf...... }
 - iOS  block 的底层实现
		
其实swift 的闭包跟 OC的block 是一样一样的,学会了block,你swift里边的闭包就会无师自通. 参考:http://www.jianshu.com/p/e23078c11518 ht ...
 - iOS 面试题(二):什么时候在 block 中不需要使用 weakSelf --转自唐巧
		
问题 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof(self) weakSelf ...
 - 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self
		
前言: 在处理完框架内存泄漏的问题后,见上篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug 发现业务代码有一个地方的内存没释放,原因很也简单: ...
 - iOS __weak __strong WeakSelf StrongSelf
		
在block中常常会用到self,可是会造成循环引用.这时候就需要这样来解决这个问题: #define WeakSelf __weak typeof(self) weakSelf = self #de ...
 
随机推荐
- 使用PHP实现蜘蛛访问日志统计
			
$useragent = addslashes(strtolower($_SERVER['HTTP_USER_AGENT'])); if (strpos($useragent, 'googlebot' ...
 - 第一篇、Apache和Tomcat的整合
			
1.web架构 首先上图,解释web通用架构 通常情况下分为三大块 : ★ Web server : 通常情况下由 Apache Http Server . IBM Http Server .I ...
 - ContextSwitchDeadlock was detected Message(读取注册表时出现).
			
google的时候,在StackOverflow中得到个暂时解决的方法: http://stackoverflow.com/questions/2797677/contextswitchdeadloc ...
 - [转]Delphi中ShellExecute的妙用
			
Delphi中ShellExecute的妙用 ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件.打开一个目录.打印一个文件等等),并对外部程序有一定的控制. ...
 - 文字和表单(checkbox/radio)元素垂直对齐方法,兼容Firefox和IE。
			
这几天在做表单时总会碰到复选框(checkbox)和单选框(radio)与文字不对齐的问题,要不是checkbox上浮了,要不是文字上浮.在前端开发过程中,单(复)选框和它们后面的提示文字在不进行任何 ...
 - hadoop 分片与分块,map task和reduce task的理解
			
分块:Block HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为64MB.与单磁盘文件系统相似,存储在 HDFS上的文件均存储为多个块,不同的是, ...
 - Composite 模式的实现
			
实现要点: 1.组合模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器. 2 ...
 - GridBagLayout的帮助类
			
自备详细注释 /* * To change this license header, choose License Headers in Project Properties. * To change ...
 - 优秀Android开源项目
			
开源项目汇总: Trinea/android-open-project · GitHub 包含个性化控件.工具库.优秀项目.开发及测试工具等 优秀完整项目: 1.Google I/O Android ...
 - scons小结
			
scons是用python写的,据说是比make要方便很多,其实我都没写过makeFile...... 1.安装 方式1:下载安装包安装,需要用python setup.py install去编译 方 ...