建立NetworkTools
对象
class NetworkTools: NSObject {
/// 加载数据
///
/// - parameter finished: 完成回调
func loadData(finished: () -> ()) {
print("开始加载数据...")
// ...
finished()
}
deinit {
print("网络工具 88")
}
}
实例化NetworkTools
并且加载数据
class ViewController: UIViewController {
var tools: NetworkTools?
override func viewDidLoad() {
super.viewDidLoad()
tools = NetworkTools()
tools?.loadData() {
print("come here \(self.view)")
}
}
/// 与 OC 中的 dealloc 类似,注意此函数没有()
deinit {
print("控制器 88")
}
}
- 运行时不会造成循环引用,因为
loadData
执行完毕后,就会释放对 self 的引用
修改NetworkTools
,定义回调闭包属性
/// 完成回调属性
var finishedCallBack: (()->())?
/// 加载数据
///
/// - parameter finished: 完成回调
func loadData(finished: () -> ()) {
self.finishedCallBack = finished
print("开始加载数据...")
// ...
working()
}
func working() {
finishedCallBack?()
}
deinit {
print("网络工具 88")
}
- 运行测试,会出现循环引用
解除循环引用
- 与OC类似方法
/// 类似于 OC 的解除引用
func demo() {
weak var weakSelf = self
tools?.loadData() {
print("\(weakSelf?.view)")
}
}
- Swift推荐方法
loadData { [weak self] in
print("\(self?.view)")
}
- 还可以
loadData { [unowned self] in
print("\(self.view)")
}
闭包(block)的循环引用小结
-
Swift
-
[weak self]
-
self
是可选项, 如果self已经被释放,则为nil
-
-
[unowned self]
-
self
不是可选项, 如果self已经被释放,则会出现 野指针访问
-
-
-
Objc
-
__weak typeof(self) weakSelf;
- 如果
self
已经被释放,则为nil
- 如果
-
__unsafe_unretained typeof(self) weakSelf;
- 如果
self
已经被释放,则出现野指针访问
- 如果
-