メモリ管理の考え方と ARC MemoryMgmt
Advanced Memory Management Programming Guide から引用
Objective-C ではインスタンスへの参照回数が 1 以上であればメモリ領域が確保され続けインスタンスは生存し続けます。
ARC では上記の retain, release はコンパイラが自動で補完してくれます。よって、書くとエラーが出てビルド出来ません。
参照には 強参照 と 弱参照 があります。
参照先のオブジェクトのオーナーシップを持っています。自分がそのオブジェクトの参照を無くすまで確実に参照することができます。swif3では変数を宣言するとデフォルトでは強参照として宣言されます。
変数宣言時にweakを付けると弱参照として設定されます。弱参照は参照先のオブジェクトのオーナーシップを持ちません。そのオブジェクトが破棄されると参照できなくなります。delegate や blocks などの利用時に登場する事が多いです。
二つのオブジェクト間で相互に強参照を持つと循環参照が起き、解放されないオブジェクトが生まれてしまいます。
この場合、片方の参照を弱参照にして回避します。
// ParentObjectのインスタンスへの強参照をparentObjが所持
var parentObj: ParentObject? = ParentObject()
// ChildObjectのインスタンスへの強参照をchildObjが所持
var childObj: ChildObject? = ChildObject()
// parentObjのインスタンス変数がchildObjへの強参照を保持
parentObj?.object = childObj
//childObjのインスタンス変数がparentObjへの強参照を保持
childObj?.object = parentObj
// parentObj.objectが弱参照の場合:
// parentObjにnilを代入すると、parentObjがParentObjectのインスタンスへの参照を解除(解放)
// childObjがnilになるので、childObjがChildObjectのインスタンスを解放
parentObj = nil
// parentObj.objectが弱参照の場合:
// parentObjにnilを代入しても、childObj.objectがParentObjectのインスタンスの強参照を保持
parentObj = nil
実際に強参照と弱参照でどのように参照の流れが変化するかを確かめてみましょう。