2009-06-20 4 views
0

私は2つのクラス、つまりDB接続とエンティティクラスを処理するクラスを持っています。 dbクラスには、GetEntityByID:(int)entity_idというインスタンスメソッドがあります。このメソッドは単純なselect文を実行し、initメソッドを使用してEntityクラスのインスタンスを作成します。どのようにこの状況でメモリ管理を処理するのですか?

これはうまくいきますが、GetEntityByIDを呼び出す人は誰でもそれを解放しなければなりません。 GetEntityByIDは "init"メソッドではないので、これは正しくないようです。この状況でのメモリ管理はどのようにして最も効果的ですか?

+0

良い質問です。以下の回答は素晴らしいです。ちょうどスタイルノート:メソッド名は一般的に小文字で始まるので、getEntityByID:が望ましいでしょう。しかし、名前を付けることはできますが、コーディング規約はコードをよりメンテナンス可能にするのに役立ちます。 :-) –

答えて

5

クラスのGetEntityIDメソッドでautoreleaseメソッドを呼び出すと、それ以外の方法で保持されていないインスタンスを自動解放できます。

クラスのインスタンス化は、DB接続クラスのメソッド内で行われるため、インスタンスは返されるオブジェクトを所有しません。つまり、DB接続クラスです。この時点で、conventionによると、あなたはメモリに必要なインスタンスを管理する:あなたは、名前が「アロケーション」または「新」で始まるか、「コピーが含まれているメソッドを使用して作成する場合は、オブジェクトの所有権を取得

"(たとえば、alloc、newObject、またはmutableCopy)、または保留メッセージを送信した場合。リリースまたは自動リリースを使用して所有するオブジェクトの所有権を放棄するのは、あなたの責任です。オブジェクトを受け取ったときは、それを解放してはいけません。

オブジェクトは、インスタンス変数として使用する場合GetEntityID方法はの終了時に割当て解除されることを防止し、返されたオブジェクトを保持することができ、例えば、周りのオブジェクトを保持することを望む送信する場合現在のイベント。ローカルでのみ使用され、現在のイベントの後に保持する必要がない場合、クラスは何もする必要はありません。現在のイベントの最後に自動解放プールによって解放されます。

This articleは、自動解放プールの詳細を説明しています。オブジェクトを自動解放する

0

GetEntityIDにこのような何かをGetEntityIDで返さ:

... // cool stuff in GetEntityID 
return [[entity_id retain] autorelease]; 
} 

より詳細にObjective-Cのメモリマングメントを説明するこれは本当にnice articleを見てください。

+0

私はそのままにしておく理由はありませんが、autoreleaseが正しい答えです。 – Chuck

+0

はい、それを保持] autorelease]は役に立たない。近い将来に元の値が解放されることを期待し、自動解放プールがフラッシュされるまで変数の値を有効にしたい場合、retainとautoreleaseのペアが使用されます。 –

+0

メソッドの戻り値に何が行われたのか分からないので、私は安全面にいたいだけでした。 – diederikh

関連する問題