weakify(self)展开后是: __weak typeof(self) __weak_self = self;
strongify(self)展开后是:__strong typeof(self) self = __weak_self;
在block中使用strongify(self);的目的是确保在block作用域内self不会被其它线程释放掉
以前我们在block中直接使用__weak_self来解除循环引用。这本身没有问题,之所以还要加strongify(self)就是为了避免block中代码执行过程中由于其它线程释放了self导致block内执行的逻辑出现问题。例如:会出现执行前几句代码时访问self还是存在的,但后面的self调用已经变为nil了
如果是在block外部定义strongify(self)虽然在block中的self还是指向(跳转到定义)这个strongify(self)。但因为方法调用结束后strongify(self)定义的局部self变量被释放了,所以这种做法就回退到了[4]
由5可知,如果block中有多个嵌套的block异步调用,那么每一个block中都要再定义一个strongify(self);
虽然在多层嵌套的block中,定义weakify(self)也是可行的。但是不推荐这么做
swift中使用unowned和weak来解决循环引用问题,基本原理同OC。但unowned本质上是__unsafe_unretained即assign,所以使用起来要小心野指针。还是推荐无脑用weak
-
不过要达到[3]中的效果,就要在当前closure的作用域内retain下self,只不过有个小麻烦是没法像OC中写的那么自然——不能使用self了。例子如下:
obj.doSomething {[weak self] in if let strong_self = self { strong_self.Member_XXX } }
详解weakify(self)与strongify(self)——针对异步回调的block中调用self的情况
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理。然而实际使用Block过程...
- 在使用RAC的代码中看到@weakify和@strongify的使用,第一感觉应该是 __weak和__stron...
- 一些关键点: block 是在栈上创建的block 可以复制到堆上Block会捕获栈上的变量(或指针),将其复制为...
- block在日常开发中非常的常用,并且也十分的简单,但是在block内使用self也会引起循环引用的情况。 voi...
- 0.很长的前言 在block语句块中,如果需引用self,而self对象中又持有block对象,就会造成循环引用循...