1

@autoreleasepoolがどのように機能するかを理解し、ARCがサポートされている最新バージョンのxcodeを使用しているので、それを使用できますが、クラス内でどのように機能するかを理解できませんでした。
私がこのインターフェースを持っているとしましょう:

@interface AppDelegate : NSObject <NSApplicationDelegate>
{
@private
    NSMutableDictionary* dictionary;
}

そして、initメソッドで辞書を割り当てて初期化します。

- (id) init
{
    self= [super init];
    if(self)
    {
        dictionary=[[NSMutableDictionary alloc]init];
    }
    return self;
}

ARCの下にいるため、deallocメソッドでは、リリースメッセージを辞書に送信できません。したがって、通常メモリを割り当てるときは、次のようにします。

@autoreleasepool
{
    NSMutableDictionary* dict=[[NSMutableDictionary alloc]init];
    < use it>
}

PS:構文エラーはご容赦ください。コンパイルせずに直接記述しました。
しかし、クラスでは、「@ autoreleasepool」ブロックをどこに配置しますか?

4

1 に答える 1

3

コードの任意のセクションの周りにブロックを配置でき@autoreleasepoolますが、実際には、私が行っていると思うことを行うべきではありません。

自動解放は、ARCが保持呼び出しと解放呼び出しを追加できるようにするよりもはるかに効率が低く、潜在的に安全ではありません。自動解放はすべてのオブジェクトを「プール」に入れ、スコープ外にあるとき、および/またはプールをダンプすることを決定したときはいつでも、プールを「排出」し、オブジェクトの保持カウントが1つ減ります。

簡単な答え:@autoreleaseAppleがドキュメントまたはテンプレートで特に明記しない限り、ブロックを完全に除外します(たとえば、main.mにはその@autoreleasepool中にが含まれます)。

これは、オブジェクトが実際にリリースされる前にリリースされる可能性があることを意味します。@autoreleasepoolブロックは、インスタンス化して大量のオブジェクトを破棄する非常にタイトなコードループがある場合に役立ちます。たとえば、巨大なデータベースを処理して文字列オブジェクトを割り当て、それらの文字列オブジェクトを使用して、作成したクラスのインスタンスのプロパティを埋めるforループ。この場合、forループ内にいる間、ARCはこれらのオブジェクトを確実に解放しない可能性があり、自動解放プールを作成する必要がある場合があります。

ただし、ARCがタイトなループで正しいことを行わないことはあまり一般的ではありません。これは、実際には非ARCの概念であり、を使用しNSAutoreleasePoolて手動で排出します。

于 2012-06-10T12:04:16.100 に答える