【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;

你可能感兴趣的:(【Swift】循环引用写法)