WeakSelf和StrongSelf
转载自:http://sherlockyao.com/blog/2015/08/08/weakself-and-strongself-in-blocks/
现在我们用 Objective-C 写代码时已经越来越多地用到了block,相比delegate的回调方式,block更直观易用。相信每个使用过block的人都遇到过block中使用self时需要weakself的情况,以下就是非常典型的一段代码:
1 |
|
对于小白的我一般越到这种情况就是直接拷贝上面这个模板到需要的代码中去,而不知个中原委。但作为一个合格的程序员,是需要完完全全明白自己写的每一行代码是在做什么的,所以现在就简单说明一下这个 WeakSelf 和 StrongSelf 到底是什么。首先看下面这段代码:
1 |
|
在ARC环境下的,每个block在创建时,编译器会对里面用到的所有对象自动增加一个reference count,然后当block执行完毕时,再释放这些reference。针对上面的代码,在animations block执行期间,self(假设这里的self是个view controller)的引用数会被加1,执行完后再次减1。但这种情况下为什么我们一般不会去weakify self呢?因为这个block的生命周期是明确可知的,在这个block执行期间当前的view controller一般是不会被销毁的,所以不存在什么风险。现在我们看下面这个例子:
1 |
|
在这种情况下,我们并不知道这个execution block什么时候会执行完毕,所以很有可能发生的情况是,我在block还没执行完毕时就想销毁当前对象(比方说用户关闭了当前页面),这时就会因为block还对self有一个reference而没有立即销毁,这会引起很多问题,比方说你写在- (void)dealloc {}
中的代码并不能马上得到执行。所以为了避免这种情况,我们会在block前加上__weak __typeof(self)weakSelf = self;
的定义来使block对self获取一个弱引用(也就是refrence count不会加1)。
那block中的StrongSelf又是做什么的呢?还是上面的例子,当你加了WeakSelf后,block中的self随时都会有被释放的可能,所以会出现一种情况,在调用doSomething的时候self还存在,在doMoreThing的时候self就变成nil了,所以为了避免这种情况发生,我们会重新strongify self。一般情况下,我们都建议这么做,这没什么风险,除非你不关心self在执行过程中变成nil,或者你确定它不会变成nil(比方说所以block都在main thread执行)。
好了,简要的说明到此结束,想要详细了解的可以自行google,这类文章很多。前面代码中的WeakSelf、StrongSelf转换看起来很冗长,不利于阅读代码,下面介绍一个超好用的宏定义代码,它是这个开源库的一部分:libextobjc。把它加入到项目中后,就可以用以下如此简洁的格式来完成转换啦:
1 |
|
WeakSelf和StrongSelf的更多相关文章
- 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(下)
深入研究Block捕获外部变量和__block实现原理 EOCNetworkFetcher.h typedef void (^EOCNetworkFetcherCompletionHandler)(N ...
- 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(上)
深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如R ...
- [HMLY]10.深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用
前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如Retain Circle的问题. 目录 1.Retain ...
- weakSelf 和 strongSelf
最近在看SDWebImage源码,碰到一些比较绕的问题,理解了很久,然后在网上查了些的资料,才算是有了一些理解.在此记录一下. 源码如下: block会copy要在block中使用的实变量,而copy ...
- weakSelf 和 strongSelf的区别和用处
block会copy要在block中使用的实变量,而copy会是变量的retainCount + 1,如若在不注意很容易造成循环引用.而所谓的循环引用的本质就是,两个对象相互引用,从而造成对象不能正常 ...
- weakSelf 运用 strongSelf来解决block的循环引用
SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication&qu ...
- 关于iOS Block当中为什么要用weakSelf和strongSelf的思考
场景:当你在某个界面请求网络数据的时候,用户不愿意等待点击了返回按钮,此时在Block当中用如下的方式使用weakSelf的话,有可能会奔溃(因为在并发编程的情况下,虽然在if判断的时候weaksel ...
- @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 ...
随机推荐
- 调试MVC项目,不关闭 IIS EXPRESS
在VS主面板打开:工具->选项->调试->编辑继续 取消选中[启用"编辑并继续"] 就OK了 (英文版的请对应相应的操作) 不过这是针对所有的调试,如果你想针 ...
- 第三十二节,datetime时间模块
首先要引入import datetime时间模块 datetime.date.today()模块函数 功能:输出系统年月日输出格式 2016-01-26[无参] 使用方法:datetime.date. ...
- JDBC事务和JTA事务的区别
转自:JDBC和JTA事务的区别 一.事务概述事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做.与事务相关的操作主要有:BEGIN TRANSACTION: 开 ...
- CSS3秘笈:第三章
1.标签选择器:控制整体. 使用标签选择器,只需要输入标签的名称即可. 2.类选择器:精确控制. 假如你要指定一些相同的元素拥有不同的样式,可以给元素添加不同的类名,然后用类选择器来应用对应的样式. ...
- 注解 @ 或者 Alt+/ 不提示 或者提示 no default propsals 解决方案
- debian上安装lua编辑器
Debian服务器上安装lua 1)下载压缩包 wget http://www.lua.org/ftp/lua-5.1.4.tar.gz 2)解压文件 tar zxvf lua-5.1.4.tar. ...
- if语句,函数function
1.语句 一般分为顺序,分支和循环语句. if是分支语句 格式1:if(){} 若满足就进入花括号,若不满足就跳过 格式2:if(){}else(){}二选一.若if满足则else一定不执行,反之则 ...
- 终于购入Mac mini,发现HDMI接口与显示器不兼容,网购了一个VGA转换插头
Mac mini买到了,最便宜的i5,$647,足够了. 发现路边捡的显示器没有HDMI接口,所以在学校图书馆问了一下IT 技术支持,给我推荐了ebay上$10块钱的转换器. 名字叫 Mini Dis ...
- Puppent 基本使用方法
简单的文件配置 master端 vim /etc/puppet/manifests/site.pp ###########################内容如下 node default{ file ...
- struts2获取请求参数的三种方式及传递给JSP参数的方式
接上一篇文章 package test; import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; impo ...