【Swift】循环引用写法

swift中使用闭包的时候如果存在循环引用,可以采用下列几种方式:

一、在闭包前使用 weak var weakSelf = self(注意weakSelf是var修饰的,因为weakSelf释放的时候需要置为nil,所以需要var修饰),然后在闭包内部使用weakSelf,但是使用weakSelf的使用是一个可选类型,需要加上?。

二、在闭包内关键词 in 前面使用加上[weak self] ,代表闭包内部所有的self都是若引用,然后在闭包内部直接使用self即可。对象释放的时候,会将self置为nil,这个也是swift推荐写法,很多第三方都这么写的。对应oc中的__weak typeof(self) weakSelf = self。

三、另外一个写法是[unowned self],类似于[weak self],也表示闭包中所有的self都是assign的,不会强引用,但是对象释放,指针地址不会变化,继续调用的话,就会出现野指针,不安全,但是如果能自己管理其内存的话,可以使用,性能效率比[weak self]好,但是一般还是推荐写[weak self]。对应oc中的 __unsafe_unretained typeof(self) weakSelf = self。

注意:

在使用上面2种方法的时候,weakSelf有可能因为闭包内部延迟执行、网络请求延迟等等导致weakSelf提前释放,可以在闭包内部再“强引用下weakSelf”。进入闭包后,加上如下代码,方法一、二写法如下:

使用一:let strongSelf = weakSelf;

使用二:let strongSelf = self;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容