iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

定義潛在 Leak

這個階段要先定義那些是我們想要抓的目標

從上一篇來看,我們可將他們分成兩類

  • Capture
  • Assign

Capture

因為不小心等元素,造成 Implict Capture
也就是沒有被妥善處理的 capture

例外1(指定 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)
    }
}

例外2(Non-escaping closure)

因為一次性使用所以以為不用檢查
但不幸的是必須檢查,因為可能發生誇層抓取

escape { // [self]
    nonescape {
        print(self)
    }
}

例外3(是 escape closure,但是可以 skip)

我們熟知的 main queue,
基本上有機會排得上隊
除非你的 app 卡住了

DispatchQueue.main.async { // [self]
    print(self)
}

Assign

因為誤用 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)

上一篇
其他 Retain Cycle 範例
下一篇
需要掃描哪幾份檔案
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言