メモリ管理の規則 翻訳元
このページの最終更新:2010-02-03
ADCの最終更新:2009-10-21
ADCの最終更新:2009-10-21
この記事ではObjective-Cでのメモリ管理の規則について解説します。
次が大原則です。
次が大原則です。
- 名前が「alloc」や「new」で始まっていたり、「copy」を含んでいるメソッド(例えば、alloc, newObject. mutableCopyなど)を使ってオブジェクトを生成したり、retainメッセージを送ったオブジェクトには所有権が発生します。その場合、releaseメソッドやautoreleaseメソッドを使って所有権を放棄する責任を負います。それ以外でオブジェクトを受け取った時は、絶対にそれを解放してはいけません。
以下は原則に由来した、または特別な事態に対処する規則です。
- 原則の帰結として、オブジェクトをプロパティとしてインスタンス変数にストアすることになった場合、そのオブジェクトを保持か複製しなくてはなりません。(これは弱い参照には適用しません。詳しくは「Weak References to Objects」参照してください。しかし、これは非常に稀です。)
- 受け取ったオブジェクトは、その受け取ったメソッド内では存続することが保証されています(マルチスレッドアプリケーションや分散オブジェクトでは例外ですが、他のオブジェクトから受け取ったオブジェクトを変更するのなら注意する必要があります)。メソッドもまた、呼び出し元に安全にオブジェクトを返すでしょう。
メッセージの典型的な副作用としてオブジェクトが使用不可能になることを避けるために、retainメッセージとreleaseメッセージ、またはautoreleaseメッセージを対応させてください(Validity of Shared Objectsを参照してください)。 - 自動解放とは「releaseメッセージを後で送る」ことを意味します。(後で定義を示します。「Autorelease Pools」を参照してください。)
これらの規則の根拠は「オブジェクトの所有権と廃棄」で解説しています。
重要:Core Foundatioinオブジェクトとよく似たメモリ管理の規則(「Memory Management Programming Guide for Core Foundation」を参照してください)があります。しかし、CocoaとCore Foundationの命名規則は異なります。特に、Core Foundationの「Memory Management Programming Guide for Core Foundationのcreate rule」はObjective-Cオブジェクトを返すメソッドには適用されません。例えば、以下のコード片では、myInstanceへの所有権を廃棄する責任はありません。 |
MyClass *myInstance = [MyClass createInstance]; |