這個階段要先定義那些是我們想要抓的目標
從上一篇來看,我們可將他們分成兩類
因為不小心等元素,造成
Implict Capture
也就是沒有被妥善處理的 capture
因為 capture self
是開發者所指定,因此 self 不是我們的目標
let handler = { [self] in
}
o1
o3
同上面的 self
所以不檢查
o2
o4
必須檢查
,但是只能往前一層抓取o5
沒有出現在該層,造成 handler2 implict capture o5
o2
檢查通過o4
檢查失敗,會影響上一層
所以必須將 L5.o4
L6.o5
標示出來
let o4 = XXX()
let handler1 = {
let o2 = XXX()
let o5 = XXX()
let handler2 = { [o1 = o2, o3 = o4] in
print(o5)
}
}
因為一次性使用所以以為不用檢查
但不幸的是必須檢查
,因為可能發生誇層抓取
escape { // [self]
nonescape {
print(self)
}
}
我們熟知的 main queue,
基本上有機會排得上隊
除非你的 app 卡住了
DispatchQueue.main.async { // [self]
print(self)
}
因為誤用
Instance function
將
Instance function
assign 到function 參數
rx
.subscribe(onNext: self.hello)
.disposed(by: bag)
將
Instance function
assign 到變數
/class property
let f = self.hello
// rx
// .subscribe(onNext: f)
// .disposed(by: bag)