1

私はObjective-Cを初めて使用しますが、NSAutoreleasePoolを正しい方法で使用しているかどうかわかりません。

  1. 自動リリースを1回だけ使用したい場合は、次のようにします。

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *newText = [NSString stringWithFormat:@"%d", prograssAsInt];
    sliderLabel.text = newText;
    [pool release]; //newText will be released
    
  2. 自動リリースを数回使用したい場合は、次を使用します。

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *newText = [NSString stringWithFormat:@"%d", prograssAsInt];
    sliderLabel.text = newText;
    [pool drain]; //newText will be released
    newText = [NSString stringWithFormat:@"%d", prograssAsInt];
    sliderLabel.text = newText;
    [pool drain]; //newText will be released
    newText = [NSString stringWithFormat:@"%d", prograssAsInt];
    sliderLabel.text = newText;
    [pool release]; //newText will be released
    

これでいい?メモリリークはありますか?

4

4 に答える 4

3

の呼び出し[pool drain]は不要だと思います。私はそれらが実際に使われるのを見たことがありません。自動解放プール内に大量のメモリを割り当てる場合は、それが必要になる可能性があります。しかし、典型的なケースでは、私はそうは思わないでしょう。

ちなみに、自動解放プールには次の構成の使用を開始することをお勧めします。

@autoreleasepool {
    ... your code ...
}

これは、明らかに、「古い」方法(あなたがそれをしている方法)よりもはるかに効率的です。機能的には同じですが、内部的にははるかに優れたパフォーマンスを発揮します。最近のXcode/iOSリリースノートには、これについて何かがありました。

于 2012-05-01T15:54:36.177 に答える
3

申し訳ありませんが、RTFMです。が呼び出された後-drain、プールはそれ自体の割り当てを解除するため、無効になります。

@autoreleasepoolそして、現在、AppleのLLVMコンパイラを使用したObjective-cには、 ARCコードと非ARCコードの両方で機能すると呼ばれる言語の追加があり、次のように活用できます。

@autoreleasepool {
    // code that will automatically have any -autoreleased variables cleaned up.
} 
于 2012-05-01T15:55:49.893 に答える
3

(2)OKではありません。-drainおよび-releaseは(参照カウント環境では)同等であり、その後-drain、自動解放プールの割り当てが解除されます。したがって、自動解放プールオブジェクトをダブルリリースし、プログラムをクラッシュさせます。

ARCの前でさえ、非常に厳しいメモリバジェットで作業しているのでない限り、ボイラープレートのほかにNSAutoreleasePoolを作成することは一般的ではありませんmain()。プールに入れられたオブジェクト-autoreleasedは、とにかくNSRunLoopのティックごとに解放されます。所有権の譲渡ルールに厳密に従う場合、メモリリークは発生しません(CocoaおよびObjective-Cを使用した参照カウントについてを参照)。

また ARCがオンになっている場合は、これを気にする必要はありません。コンパイラは、を適切な場所に挿入-retain-releaseます。


また、が(または)sliderLabel.textとしてマークされている場合、(1)で自動解放プールを解放しても、そのオブジェクトには新しい所有者がいるため、newTextは解放されません。@property(retain)(strong)

于 2012-05-01T15:57:40.143 に答える
3

通常、メインスレッドを使用していて、リソースを大量に消費するコードの巨大なループを使用していない場合は、独自の自動解放プールを作成する必要はありません。作成されたデフォルトのものを使用してください。

マルチスレッドを使用している場合、またはメモリを大量に消費する長時間実行ループを実行している場合にのみ、独自に作成する必要があります(とにかくメインスレッドでは実行しないでください)。

于 2012-05-01T16:12:36.670 に答える