1. ホーム
  2. objective-c

[解決済み] NSAutoreleasePoolのオートリリース・プールはどのように機能するのですか?

2023-02-01 08:20:17

質問

私の理解では アロック , 新しい または コピー は手動で解除する必要があります。例えば

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

私の疑問は、しかし、これは同様に有効ではないでしょうか?

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}

どのように解決するのですか?

はい、2番目のコードスニピットは完全に有効です。

オブジェクトに -autorelease が送信されるたびに、それは最も内側の autorelease プールに追加されます。プールが枯渇すると、プール内のすべてのオブジェクトに -release を送信するだけです。

autorelease プールは、単に -release の送信を "later" まで延期することを可能にする便利なものです。その "later" はいくつかの場所で起こる可能性がありますが、Cocoa GUI アプリで最も一般的なのは、現在の実行ループ サイクルの終了時です。