Automatic Reference Counting
昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html を読む。
- ARCは「ちょうどうまくいく」
- 参照カウンタが適用されるのはクラスのインスタンスだけ
- 強い参照の循環ができるとメモリが開放されない
- 強い参照の替わりに、弱い参照か、所有されていない参照を使えば良い
- 弱い参照はオプショナル型の 変数
var
でなくてはならない weak var tenant: Person?
- 所有しない参照は参照されるインスタンスの寿命が同じか長いときに使われる
- 非オプショナル型として定義される
- deallocateされたあと、参照先にアクセスするとランタイムエラー
unowned let customer: Customer
- お互いに参照しあうとどっちかがOptionalになる←非Optionalにするとコンストラクタでselfにアクセスする2段階初期化問題があるから
- 暗黙にunwrapされたOptionalな型にする方法がある
var capitalCity: City!
- クロージャはクラスのインスタンスと同様に参照型
- クロージャ本体が
self
にアクセスするとself
をキャプチャーする - そのクロージャを
self
が指すオブジェクトのプロパティ値に入れると、循環参照ができてしまう - 「キャプチャリスト」をつくることで、この問題を解決する
- クロージャの開始
{
と(引数リスト)との間に - 引数リストと返り値方が型推論される時は、クロージャの開始
{
とin
との間に [unowned self, weak delegate = self.delegate!]
weak
でキャプチャしたやつは Optional型
やっぱり参照カウンタからは逃れられなかったよ