Swiftの初心者の中には、自動参照カウントを使えば、メモリー管理は気にしなくても良いと認識している方が多くいます。確かにSwiftは、ごみ収集システムを使うより、予測可能性は高いと言えます。しかし自動参照カウントを使用する際は、メモリー構造を意識する必要があります。ユーザーは、幾つかの方法でメモリー構造の落とし穴を避けることができます。今回のトークでは、メモリーの取り扱い方法について分かりやく説明します。
メモリー管理の嬉しいバイキング料理
iPadで操作する顕微鏡を開発しています。
Swiftは自動でメモリを管理してくれます。
なので心配しなくていいという人がいるかもしれませんが、少し仕組みがわかると精度が高い、バグのないプログラムを書ける。
メモリの割り付けはこのどちらか
スコープから出ると全部開放される。とても早い処理です。
ただ、スコープから出るときに必ず開放する、もう少しダイナミックにしたい時がある。
その時はヒープ領域を参照型で使う
ヒープをロックして
スタックから一つ参照される
変数の名前を定数にすれば代入しようとするとRejectされる。参照型では定数を使ったほうが良い。
す宅からの参照が消えればリリースされるが問題が起きることもある。
循環参照の例
Xcodeではグラフが出るようになりましたね
治すには弱参照を使います
このように参照が全部言えると弱い参照に対して勝手にnilになる。
Objective-Cはロッキングテーブルを使っていた
Swiftではゾンビが残って、消えているはずの参照を見に来たらnilを返して、本当に参照が無くなった時開放される。
お前はもう死んでいる
もうひとつUnownedがあるが、これは参照がかならずあることを前提にしていてなければプログラムが停止する。
動きは先程と同じ、ゾンビを見に行ったら、nilを返すのではなくて、これはダメだとプログラムを停止する。
これはコンパイルできない。
self.
を書きなさいと言われる。それが循環参照を作っているかもしれないというヒント。
このパターン覚えました?非同期のケースを考えましょう
Why Swift Peaple, Why...
強参照で参照し続ける必要がある。
延命したくない時は
一般的にはチェックを行う
まとめ
たとえば次のSwift5,6辺りでよくなって、わかりやすくなるのではと思うけど、非同期はなんとかなるかもしれないですね。でも原理としてはなくならないと思います。予測性があってAppleは多分私の考えでは設計ツールやビジャライズのツールが良くなってきて、プログラマとして設計の時に考えるようになるのではないかと思います。
Q&A
weak self を書かなくても循環参照になっていないのはなぜか
クロージャの参照を持っているのが self ではないので循環参照にならない
strong weak 踊りは英語では?
strong weak dance
日本語でもダンスのほうが良いと思います
(会場笑い)
ゾンビの辺りで、聴き逃しかも知れないが、ゾンビの発生条件をお聞きしてもよろしいですか
strong の参照カウントが0になるとdeinitializeが走る。weakカウントが0ならメモリを開放するが、そうでなければメモリは残る。weakカウントが下がる、あるいはアクセスをすると下がる、そのweakカウントが0になった時にメモリまでカウントする。
weak用の参照カウントがあるということですね。weakの参照でメモリリークすることがあるのでしょうか
シエスタというネットワークライブラリがあってキャッシュ機能があるが、strongをweakに変えている箇所があるがそれだけでは開放されない。 参考文献に詳しく書かれているのでそちらの参照を是非
感想
twitter.comRayWenderlichのSwiftセクションの人! #iosdc #a
— ひらり (@hiragram) 2016年8月20日
これいいよね。https://t.co/xtUmjrTUgK #iosdc #a
— Daiki Matsudate (@d_date) 2016年8月20日
— gonou (@gonou_1024) 2016年8月20日twitter.com
twitter.comSwiftのweakがObjCと別スタイルで管理されているの知らんかった。
— Kohei Tabata (@nerd0geek1) 2016年8月20日
#iosdc #a
twitter.comSwift weak は「お前はもう死んでいる!」 #iosdc #a
— SatoTakeshi_カエルタベル (@hatakenokakashi) 2016年8月20日
twitter.comメモリ開放するときは、ケンシロウががんばってるのか #iosdc #a
— haranicle (@haranicle) 2016年8月20日
twitter.com今日はヒープとスタックの話を聞いていると思ったらアニメを見ていた#iosdc #a
— ダンボー田中@味噌汁への憎しみ (@ktanaka117) 2016年8月20日
twitter.comサンプルコードはSwift 3で書かれてますね #iosdc #a
— Syo Ikeda / いけしょー (@ikesyo) 2016年8月20日
twitter.comweak strong dance https://t.co/9fF71uFRlm #iosdc #a
— Yoshikuni Kato (@yoshikuni_kato) 2016年8月20日
twitter.comクロージャーのキャプチャーリスト、無思考でweakでいいというわけじゃなくて、ちゃんとunownedが意味的に正しい場面、weakが正しい場面を使い分けていてよいですね #iosdc #a
— Syo Ikeda / いけしょー (@ikesyo) 2016年8月20日
twitter.comApple の人的には strong weak dance はしないほうがいい、そのほうがキレイに書けると言っているらしい #iosdc #a
— gonou (@gonou_1024) 2016年8月20日
まとめ
「Ray Wenderlich"の中の人が徹底解説! Swiftにおけるメモリ管理の落とし穴 #iosdc #a」をトゥギャりました。 https://t.co/8NLXG0WJuV
— トゥギャッター開発まとめ (@tg__dev) August 20, 2016