今回はトレイリングクロージャにおけるキャプチャリストについての気づきをシェアします!
小ネタですが、意識しないと気づかずメモリリークを起こす原因になるような注意点です!
本題: 弱参照のつもりが、強参照に!?
ネットにあるコードを読んでいると、たまに、メモリリーク解消を目的とした弱参照を宣言するために、以下のような実装を見かけます。
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
となります。
おわり
メモリリークの原因になるので気をつけたいですね😵