4

私はまだObjective-Cのメモリ管理のニュアンスのいくつかに頭を悩ませており、私が確信していない次のケースを思いついた:

+ (NSDecimalNumber*)factorial: (NSDecimalNumber *)l {

    NSDecimalNumber *index = l;
    NSDecimalNumber *running = [NSDecimalNumber one];

    for (; [index intValue] > 1; index = [index decimalNumberBySubtracting:[NSDecimalNumber one]]) {
        running = [running decimalNumberByMultiplyingBy: index];
    }
    return running;
}

ここで、decimalNumberByMultiplyingByとdecimalNumberBySubtractingは、多くのNSDecimalNumbersを作成します。これは、私が理解しているように、最終的には自動解放されますが、それまでは、含まれているプログラムが非常に多くのメモリにハングアップするのではないかと心配しています。

どこかに自動解放プールを導入する必要がありますか?(もしそうならどこで?)それはパフォーマンスに顕著な影響を与えるでしょうか(使用中の大量のメモリの副作用と比較した場合)?

ここで使用する適切なメカニズムは自動リリースですか?ループを分割して、メモリを手動で解放することを検討する必要がありますか?

これはおそらくn00bの質問ですが、この状況でのベストプラクティスが何であるかを把握しようとしています。

4

3 に答える 3

5

実行ループの1回のパス内に、自動解放された大きなオブジェクトの束を作成しないようにすることをお勧めします。あなたはすでに解決策を知っているようです。自動解放されていないオブジェクトを使用して、使い終わったら解放することができます。多数の自動解放されたオブジェクトを作成するコードのセクションの自動解放プールを作成することもできます。オブジェクトが自動解放されると、それを囲む自動解放プールが解放/排出されるときに解放されます。自動解放プールを使用すると、次のようになります。

NSAutoReleasePool *subPool = [[NSAutoreleasePool alloc] init];
// Code that generates a bunch of autoreleased objects.
[subPool release];

ただし、最適化を行う前に、いくつかのベンチマークを実行して、実際に最適化する必要があるかどうかを確認してください。私の推測では、あなたが示した方法は問題を引き起こさないでしょう。ただし、単一のループ内の100万個のランダムな整数のセットにメソッドを適用しようとしているとしましょう。その場合、自動解放プールを使用することでメリットが得られる可能性があります。

詳細については、AppleのCocoa用メモリ管理プログラミングガイドをご覧ください。

于 2010-10-07T02:24:16.700 に答える
1

答えを決定する最良の方法は、いくつかの異なる方法を書いてテストすることです。これが問題になることはないと思いますが、NSDecimalNumbersは最大で約100!になり、100個のNSDecimalNumberオブジェクトはおそらく少しの違いはありません。


他の質問への回答:重要な状況では、オブジェクトを手動で解放できます。そのループ内に自動解放プールを作成することもできます。自動リリースは超高速です。

while(/*condition*/) {
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // code goes here

    [pool drain];
}
于 2010-10-07T02:08:31.647 に答える
1

ループ内に自動解放プールを設定することもできますが、なぜわざわざするのでしょうか。

階乗を計算しているため、このループにそれほど多くのオブジェクトを蓄積することはできません。最大の指数NSDecimalNumberは127です。

ループを100回繰り返す前に、オーバーフローエラーが発生します。

アプリケーションがメインの実行ループを通過するたびにメインの自動解放プールが空になるため、自動解放された値があまり長くハングアップすることはないことに注意してください。

于 2010-10-07T02:08:38.377 に答える