所以我們將所有的資訊統整起來
變數:
closure 階層:
可以透過 origin source ref
以及 closure.offset
進一步判斷跨越了哪幾個 closure
let obj/*Origin*/ = Object()
escape {
nonescape {
DispatchQueue.main.async {
print(obj)
}
}
}
透過 cursor info(obj) 得知 obj 的來源,位於 objOrigin
所以經過了三個 closure
以及 obj
最終符合這些條件的變數,即為 potential leak
if variable.isWeak || variable.isStruct {
return false
}
for closure in closures {
if closure.isNonEscape || closure.isSkip {
return false
}
}
return true
判斷每一層 closure 是否為 escape 後
variable.offset < closures.first.offset