1.闭包的循环引用
//Created by zhangmi on 15/2/28.
//Copyright © 2016年Paramount Pictures. All rights reserved.
importUIKit
classViewController: UIViewController{
//vc -- strong --闭包
//闭包-- strong -- vc相互强引用
//定义属性闭包
//swift属性的默认就是强引用
var finished Callback: ((res:String) -> ())?
override func viewDidLoad() {
super.viewDidLoad()
1.1swift中特殊的写法1
//weak var weakSelf = self
loadData { [unownedself] (result)in
print(result,self)}}
//[unowned self]和__unsafe__retained作用类似-->对象被回收时,内存地址不会自动指向nil,会造成野指针访问
1.2.swift中解决办法1
func method InSwift2() {
//2.swift中特殊的写法
//weak var weakSelf = self
loadData { [unownedself] (result)in
print(result,self)}}
//2. swift中解决办法1
//[weak self]和__weak typedod(self)作用类似-->对象被回收时,内存地址不会自动指向nil,更加安全,推荐使用这种方式
funcmethodInSwift1() {
//1.swift中特殊的写法
//weak var weakSelf = self
loadData { [weakself] (result)in
print(result,self)
}
}
2.解决循环引用的方式
funcmethodInOC() {
//1.仿照oc解决
//弱引用的对象有一次执行nil的机会
weak var weakSelf =self
loadData { (result)in
print(result, weakSelf)
}
}
funcloadData(finished: (result:String) -> ()) {
finished Callback = finished
dispatch_async(dispatch_get_global_queue(0,0)){
NSThread.sleepForTimeInterval(2)
//在主队列回调
dispatch_async(dispatch_get_main_queue(),{
//执行闭包
finished(result:"办证: 12345678910")
})
}
}
//dealloc oc
//析构函数
deinit{
print("我已经销毁")}
3. 三种解决办法的总结:
//1.解决循环引用的方式,仿照oc解决
//弱引用的对象有一次执行nil的机会
funcmethodInOC() {
*weak var weakSelf =self*
loadData { (result)in
print(result, weakSelf)
}
//2. swift中解决办法1
swift中特殊的写法
//[weak self]和__weak typedod(self)作用类似-->对象被回收时,内存地址不会自动指向nil,更加安全,推荐使用这种方式
funcmethodInSwift1() {
loadData{ [*weak self]* (result)in
print(result, self)
}
}
//3.swift中解决办法2
[unowned self]和__unsafe__retained作用类似-->对象被回收时,内存地址不会自动指向nil,会造成野指针访问
funcmethodInSwift2() {
loadData{ [unowned self] (result)in
print(result, self)
}
}
网友评论