を行うのに最適な場所である私は、オブジェクトのためにdeallocは、そのオブジェクトの保持 カウントがゼロになった場合にのみ、呼び出されることを読みました。
はい。
簡略化のため、currentColor
オブジェクトを含むクラスをColorContainer
と呼びます。さて、あなたは次のようなColorContainer
のインスタンス作成する場合:containerColor
ため
ColorContainer* containerColor = [[ColorContainer alloc] init]; // retain count + 1
保持カウントが1になります。
UIColor
のインスタンスを作成し、そのインスタンスをcurrentColor
プロパティに設定するとします。この場合、2通りの方法があります。 最初のインスタンスでは、次のようなインスタンスを作成できます。 initWithRed:green:blue:alpha:
のようなインスタンスメソッドを使用する場合は、明示的にメモリを解放する必要があります。
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2 because you use a retain policy
[color release]; // retain count -1, now the referenced object has a retain count of 1
第2の方法では、代わりにクラスメソッド(+記号)を使用できます。この場合、そのクラスメソッドで作成されたオブジェクトは、アプリケーションの存続期間の特定の時点で自動解放されるため、メモリの抽象度を解放する必要はありません。
containerColor.currentColor = [UIColor whiteColor]; // retain count +1
次に、containerColor
オブジェクトをリリースするとします。 containerColor
の保持カウントが1に等しい場合、それを使用するオブジェクトから解放すると、deallocメソッドを呼び出して、currentColor
で参照されるオブジェクトも破棄することができます。あなたはこの
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2
//[color release];
をすれば、それは、実際には1のカウントを保持している場合にのみ、あなたが
currentColor
が参照するオブジェクトが完全にメモリから削除されていることに注意する必要があり、この単純なケーススタディ(却下)で
あなたはメモリリークを作成します(理解しますか?)。あなたがretain
、copy
、init
またはnew
を(それがalloc-init
のと同じです)を使用する場合、あなたはそれらに対応release
またはautorelease
を呼び出すために常に持って、要約する
。
メモリリークを避けるため、経験則として、オブジェクトの保持カウントのバランスを常に取る必要があります。
したがって、メタファとして、あなたは木のように思い出すことができます。親(containerColor
)と子(currentColor
)があるとします。親(1のカウントを保持する)が解放された場合、そのオブジェクトのdeallocメソッドと空きメモリが呼び出されます。 deallocメソッドで、(保持カウント1の)子を解放すると、deallocメソッドを呼び出してメモリを解放します。子の保持カウントが1より大きい場合、メモリリークが発生します。
希望します。
あなたがAbout Memory Managementを読むことができるさらなる情報について編集
。 iOS 5以降、AppleはARCを導入しています。 Automatic Reference CountingはObjective-Cオブジェクトの自動メモリ管理を提供するコンパイラです。情報については、Transitioning to ARC Release Notesを参照してください。
Hello Flex、ありがとうございます。 – karthick
あなたは大歓迎です! –