今回はトレイリングクロージャにおけるキャプチャリストについての気づきをシェアします!
小ネタですが、意識しないと気づかずメモリリークを起こす原因になるような注意点です!
本題: 弱参照のつもりが、強参照に!?
ネットにあるコードを読んでいると、たまに、メモリリーク解消を目的とした弱参照を宣言するために、以下のような実装を見かけます。
alertController.addAction(UIAlertAction(title: "OK", style: .default) { [weak self, alertController] _ in
[weak 変数1, 変数2]
のような実装になっていますね。
コードを読むと、どうやら 変数1
変数2
ともに weak
属性にして弱参照にしたいようです。
が、この実装では 変数2
が強参照になります。
もう一度申し上げます。
変数2
は強参照です。
対策
じゃあ、どうするか??
[weak 変数1, weak 変数2]
とそれぞれの変数の前に weak
を宣言することで実現可能です。
先程の UIAlertAction
のトレイリングクロージャの例だと、
alertController.addAction(UIAlertAction(title: "OK", style: .default) { [weak self, weak alertController] _ in
となります。
おわり
メモリリークの原因になるので気をつけたいですね😵