1. ホーム
  2. ios

[解決済み] Objective-Cのオートリリース・メモリ管理

2022-02-14 01:24:57

質問

autorelease をいつ呼び出すか、そしてこれが私のオブジェクトに対して実際に何を行うかを理解しようとしています。

を読んで メモリー管理について Mac Developer Library の中で、新しいオブジェクトを作成してそれを返すというファクトリーメソッドとして機能するメソッドがある場合、そのメソッドはオブジェクトを返す前に解放する方法がない、ということを理解しました。

- (Test *) createNewTest 
{
    Test *newInstance = [[Test alloc] init];
    [newInstance release];
    return newInstance; // deallocted object returned.
}

代わりに autorelease :

NSObject で定義される autorelease メソッドは、受信機を後で解放するためにマークする。

私の質問は、オブジェクトが後で解放される場合、その解放されるタイミングをどのように知ることができるかということです。

- (Test *) createNewTest 
{
    Test *newInstance = [[test alloc] init];
    [newInstance autorelease];
    return newInstance;
}

- (void) runIt
{
    Test *myInstance = [self createNewTest];
    // when is myInstance released?? and thereby not valid to my function anymore?
}

返されたオートリリースオブジェクトを、どうすれば安全に runIt メソッドで、いつ自動解放されるかがわからない場合、どうすればよいのでしょうか?メソッドによって返されたオブジェクトを保持すべきでしょうか? createNewTest ? それとも runIt のスコープを使用できますか?

解決方法は?

オートリリース・オブジェクトがオートリリース・プールに追加されました。

オートリリースプール内のオブジェクトは、メインランループの反復処理の終了時に解放されます(または、独自のオートリリースプールを管理している場合やdrainを呼び出した場合は、より早く解放されます)。

オートリリースされたオブジェクトを返すメソッドを呼び出すと、少なくともそのメソッドが呼び出されたスコープの終わりまで有効であることがほぼ保証されます。

もし、より長く生き続けたいのであれば、それを保持し、それを使い終わったら再び解放することを忘れないでください。