1

私は「大きな」ものを持つことはできませんNSAutoreleasePoolmain()私はそれに触れることを許されていません. では、オブジェクトごとに 1 つのプールを持つとはどういうことでしょうか?

struct MacGuiEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

struct MacFontEngine
{
  // members …

  ScopedAutoreleasePool pool;
};

これは有効な「パターン」ですか?

4

1 に答える 1

1

あなたが触れられないと言うときmain()、あなたはいつ電話しますUIApplicationMain()か? main()Mac では自動解放プールを作成する必要がないため、これは iOS であると想定しています。呼び出すUIApplicationMain()場所は、最上位の自動解放プールが必要な場所です。

自動解放プールはイベント ループごとに自動的に作成されるため、通常は作成する必要はありません。私の最初の実験ではmain()、iPad から削除しても、少なくともリークは発生しませんでした。にブレークポイントを設定することで確認できます__NSAutoreleaseNoPool()。唯一の問題は、イベント ループの前に呼び出されるメソッドです。アプリケーションデリゲートがプログラムで生成さ-initれた場合、イベントループの前に呼び出される可能性があると思います。しかし、アプリデリゲートで自動解放されたオブジェクトを作成して+initializeも、リークは発生しませんでした。

自動解放プールが必要な場所がある場合 ( get__NSAutoreleaseNoPool()が呼び出され、「オブジェクトがプールなしで自動解放されました -- ただリークしている」などのメッセージが表示される場合)、そのメソッドでプールを作成するだけで済みます。

- (id)someMethod {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ....
    id result = ....

    [pool drain];
    return result;
}

しかし、メインの実行ループを開始する方法についてはまだ少し迷っていますが、自動解放プールを作成することはできません。

于 2011-03-30T19:29:03.710 に答える