1.閉包的循環(huán)引用
//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作用類似-->對象被回收時,內(nèi)存地址不會自動指向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)作用類似-->對象被回收時,內(nèi)存地址不會自動指向nil,更加安全,推薦使用這種方式
funcmethodInSwift1() {
//1.swift中特殊的寫法
//weak var weakSelf = self
loadData { [weakself] (result)in
print(result,self)
}
}
2.解決循環(huán)引用的方式
funcmethodInOC() {
//1.仿照oc解決
//弱引用的對象有一次執(zhí)行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)
//在主隊列回調(diào)
dispatch_async(dispatch_get_main_queue(),{
//執(zhí)行閉包
finished(result:"辦證: 12345678910")
})
}
}
//dealloc oc
//析構函數(shù)
deinit{
print("我已經(jīng)銷毀")}
3. 三種解決辦法的總結:
//1.解決循環(huán)引用的方式,仿照oc解決
//弱引用的對象有一次執(zhí)行nil的機會
funcmethodInOC() {
*weak var weakSelf =self*
loadData { (result)in
print(result, weakSelf)
}
//2. swift中解決辦法1
swift中特殊的寫法
//[weak self]和__weak typedod(self)作用類似-->對象被回收時,內(nèi)存地址不會自動指向nil,更加安全,推薦使用這種方式
funcmethodInSwift1() {
loadData{ [*weak self]* (result)in
print(result, self)
}
}
//3.swift中解決辦法2
[unowned self]和__unsafe__retained作用類似-->對象被回收時,內(nèi)存地址不會自動指向nil,會造成野指針訪問
funcmethodInSwift2() {
loadData{ [unowned self] (result)in
print(result, self)
}
}