0

db接続を処理するクラスとエンティティクラスの2つのクラスがあります。dbクラスには、GetEntityByID:(int)entity_idというインスタンスメソッドがあります。このメソッドは単純なselectステートメントを実行し、initメソッドを使用してEntityクラスインスタンスを作成します。

これは正常に機能しますが、GetEntityByIDを呼び出す人は、それを解放することを忘れないでください。GetEntityByIDは「init」メソッドではないため、これは正しくないようです。この状況でメモリ管理を最適に処理するにはどうすればよいですか?

4

2 に答える 2

5

他に保持されていない場合は、クラスのメソッドを呼び出しautoreleaseて、インスタンスを自動解放できます。GetEntityID

クラスのインスタンス化はDB接続クラスのメソッド内で行われるため、インスタンスに返されるオブジェクトはそれを「所有」しません。つまり、DB接続クラスです。この時点で、慣例に従って、インスタンスをメモリ管理する必要があります。

名前が「alloc」または「new」で始まるメソッドまたは「copy」を含むメソッド(alloc、newObject、mutableCopyなど)を使用してオブジェクトを作成する場合、またはオブジェクトに保持メッセージを送信する場合は、オブジェクトの所有権を取得します。リリースまたは自動リリースを使用して、所有するオブジェクトの所有権を放棄するのはユーザーの責任です。オブジェクトを受け取ったときは、それを解放してはなりません。

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

この記事では、自動解放プールについて詳しく説明します。

于 2009-06-20T19:01:58.393 に答える
0

で返されたオブジェクトを自動解放するには、GetEntityID次のようにしますGetEntityID

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

Objective-Cのメモリ管理について詳しく説明しているこの本当に素晴らしい記事をご覧ください。

于 2009-06-20T19:50:34.770 に答える