方法1:OC 的方式
weak var weakSelf = self
注意:weak 只能修饰 var, 不能修饰 let
weak must be a mutable variable, because it may change at runtime
weak 可能会被在运行时被修改 -> 指向的对象一旦被释放, 会被自动设置为 nil
方法2: swift 推荐用法
{ [weak self] in
print(self?.view as Any)
}
注意 [weak self] 表示 {} 中的所有 self 都是弱引用, 需要注意解包
方法3: swift 的另一个用法, 了解就好
{ [unowned self] in
print(self.view)
}
注意:
[unowned self] 表示 {} 中的所有 self 都是 assign 的, 不会强引用, 但是, 对象释放, 指针地址不会发生变化, 如果对象释放后继续调用, 会出现野指针问题
另外 -- 复习一下 OC 解决循环引用的两种方法:
方法1: __weak (只能在 ARC 中使用, MRC 中没有 __weak)
__weak typeof(self) weakSelf = self;
在 swift 中的语法为👆方法2
方法2: __unsafe_unretained (ARC 和 MRC 都可以使用)
__unsafe_unretained typeof(self) unsafeSelf = self;
在 swift 中的语法为👆方法3
区别:
- __unsafe_unretained 弱引用对象都用 assign 修饰, 不会增加引用计数. 但是对象被释放, 地址不会改变, 继续访问, 会引起野指针
- __weak, 本质上是观察者模式, 一旦对象被释放后, 指针地址自动置为 nil, 更加安全
- 效率: weak 效率上稍微差一些
- (大神说 __unsafe_unretained 比较厉害, 但是玩不好, 野指针会让你哭, 慎用, 慎用)
网友评论