iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

自己的 Leak, 自己抓(swift)系列 第 21

實現 detect potential leak(capture)

  • 分享至 

  • xImage
  •  

所以我們將所有的資訊統整起來

變數:

  • origin source ref
  • is weak
  • is struct(尚未導入 IndexstoreDB,簡易判斷版本)
  • is skip type(尚未實作)

closure 階層:

  • is escape closure
  • is skip function

closures

可以透過 origin source ref 以及 closure.offset 進一步判斷跨越了哪幾個 closure


範例

let obj/*Origin*/ = Object()
escape {
  nonescape {
    DispatchQueue.main.async {
      print(obj)
    }
  }
}

透過 cursor info(obj) 得知 obj 的來源,位於 objOrigin

所以經過了三個 closure

  • escape
    • isNonEscape: x
    • isSkip: x
  • nonescape
    • isNonEscape: o
    • isSkip: x
  • async
    • isNonEscape: x
    • isSkip: o

以及 obj

  • obj
    • isWeak: x
    • isStruct: x(假設是 class)

Final

最終符合這些條件的變數,即為 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


上一篇
建立 skip list
下一篇
導入 Danger?
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言