block对于属性的截获导致循环引用的问题

来源:7-5 Block循环引用相关面试问题&面试总结

鹤笑天

2020-03-31

老师,您好如下图的这个解决方案,对于循环引用不是还是self强持有block,block强持有self么?不应该是使用__weak __typeof(self) weakSelf = self;来破除循环引用么?图片描述

没太理解您说的因为array是strong类型的,所以会循环引用
那如果是一个常量age呢用assin修饰,在block中调用self.age就不会造成循环引用?

写回答

2回答

于海

2020-04-03

_array是self的成员变量。不加weak的情况下使用_array会造成block对self的强引用,而block又作为self的成员变量,所以会循环引用。有很多同学会不理解一个类持有的block对象的执行体中引用类的成员变量为什么会循环引用。前面也从源码角度分析了block在编译后对截获变量的处理,实际上就是引用self

1
3
卷王Charles
回复
ameba
是可以的,weakSelf后,通过weakSelf.array 来调用。 老师的解答真的让人头疼,课程中讲的不够清晰也就算了,对于一些关键的疑惑点解答的也不全面
2021-10-07
共3条回复

慕UI9212626

2021-05-22

老师你前边说过,局部对象会连同修饰符一同被截获,这里的_array是属于局部变量吗?为什么它属于局部对象,局部变量的定义不应该是出大括号失效吗?

0
1
卷王Charles
局部对象,或者类的属性(对象),都会被截获,这里的array是类的属性
2021-10-07
共1条回复

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程