2012-05-01 10 views
1

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

  1. 私は、私が使用して一度だけ自動解放を使用する場合:私は、私が使用してautoreleaseを複数回使用する場合は

    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 
    

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

答えて

3

(:

とは、現在、AppleのLLVMコンパイラとObjective-Cで、あなたのような活用ができることを、ARCと非ARCコードの両方で動作します@autoreleasepoolと呼ばれる言語の追加があります2)はOKではありません。 -drain-releaseは(参照カウント環境で)同等であり、その後に自動解放プールが割り当て解除されると、-drainが解放されます。したがって、自動解放プールオブジェクトをダブルリリースしてプログラムをクラッシュさせます。

ARCの前でさえ、非常に厳しいメモリ予算で作業していない限り、定型文main()のほかにNSAutoreleasePoolを作成するのは非典型です。とにかくNSRunLoopのダンプごとにオブジェクト-autoreleaseがプールにリリースされます。所有権移転ルールに厳密に従うとメモリリークは発生しません(Understanding reference counting with Cocoa and Objective-C参照)。 ARCはあなたをオンと

そしても、この気にする必要はありません - コンパイラはあなたのための右の場所で-retain-releaseを挿入します。また


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

3

[pool drain]への呼び出しは不要です。私は彼らが実際に使用されていることを見たことがない。 autoreleaseプールの中に膨大な量のメモリを割り当てているのであれば、それが必要かもしれません。しかし、典型的なケースでは、私はそうは思わないでしょう。

あなたは、自動解放プールのために、方法によって、以下の構文を使用して開始したいと思うでしょう:

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

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

3

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

@autoreleasepool { 
    // code that will automatically have any -autoreleased variables cleaned up. 
} 
+0

私は無礼さが不当だと思います。これは文書化されていますが、実際にはドキュメントを読んだ経験のあるCocoaプログラマーから、それが何を言ったのかは分かりませんでした。私はそれがフレームワークに新しい誰かのための不合理な質問だとは思わない。 – Chuck

3

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

マルチスレッドの場合や、メモリーを大量に消費する長時間実行しているループの場合は、自分で作成する必要があります(おそらくメインスレッドでは実行しないほうがよいでしょう)。

関連する問題