请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

正在回答

2回答

于海 2020-04-03 13:54:26

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

1 回复 有任何疑惑可以回复我~
  • 提问者 鹤笑天 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-04-03 17:06:49
  • ameba #2
    那像提问者说的那样 使用 __weak __typeof(self) weakSelf = self 是不是也可以
    回复 有任何疑惑可以回复我~ 2020-11-20 12:28:17
  • 卷王Charles 回复 ameba #3
    是可以的,weakSelf后,通过weakSelf.array 来调用。
    老师的解答真的让人头疼,课程中讲的不够清晰也就算了,对于一些关键的疑惑点解答的也不全面
    回复 有任何疑惑可以回复我~ 2021-10-07 19:41:24
慕UI9212626 2021-05-22 16:44:11

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

0 回复 有任何疑惑可以回复我~
  • 局部对象,或者类的属性(对象),都会被截获,这里的array是类的属性
    回复 有任何疑惑可以回复我~ 2021-10-07 19:43:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信