この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep13】車の座席を使ってサブスクリプトという機能を学ぶ」
サブスクリプトという難題を乗り越えてやってきたが、ここでまた難しそうな大きな山が。
参照カウント、なんぞそれ!
参照カウントとは
参照カウントを理解するには、iOSでどのようにインスタンスが管理されているか理解する必要がある。
参照カウントとは・・・インスタンスが変数や定数などで使われている回数のことを指します。
あ、これなんとなくわかるかも!たしか、インスタンス化された回数を数える仕組み?あれ?違うか。
→違った。
本を読み進めるとわかったこと
iOSアプリって起動されたら、設定されたクラスをインスタンス化して、その変数とかが参照される回数が多いインスタンスが優先されてメモリに残されていく。
使われているインスタンスは残るし、使われていないインスタンスはすぐデータが消されていくわけだ。
そうやって自動でインスタンスを削除してくれたり、適切なメモリ管理をしてくれる仕組みをARCという。
そういうわけで参照カウントが必要になるってことなんだね!(まあまあ理解)
参照カウントの増減
参照カウントって参照されて増えたり減ったりする。
具体的にどうなったらカウントが増えるのか減るのかは本を見ればわかるので、ここでは説明を省く。
参照されて、参照カウントが2になったり、さらに参照されなくなって−1、参照されなくなって−1で参照カウントが0になるとインスタンスが破棄される。
参照が残り続けるコードを書いてしまうと循環参照になって、参照カウントが減らない現象が起こって、アプリが正常に動かなくなってしまうから注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Car { var name: String = "MyCar" var garage: Garage? } class Garage { var car: Car? } var familyCar: Car? = Car() var garage: Garage? = Garage() familyCar?.garage = garage garage?.car = familyCar familyCar = nil garage = nil |
※お互いにお互いを参照してしまう状態のことを循環参照という。
強い参照、弱い参照
参照にも強い弱いがあって、強い参照が消えると一緒に弱い参照も消える。
循環参照になりそうだなって時は強い参照と弱い参照を使いこなせばいいってわけ。
実際にコードをみてみよう。
1 2 3 4 5 6 7 8 |
class Car { var name: String = "MyCar" weak var garage: Garage? } class Garage { var car: Car? } |
先ほど循環参照となったコードに弱い参照を使ってみよう。
weakを使っています。
さらに
1 2 3 4 5 |
var familyCar: Car? = Car() var myGarage: Garage? = Garage() familyCar?.garage = myGarage myGarage = nil familyCar?.garage |
むずかしい〜。
はい!あまり意味がわかりませんでしたが、強い参照と弱い参照があるということで。
参照カウントについてはさらっとこの辺で終わり。
コメント