1

アプリケーションの一部としていくつかのオブジェクト オブジェクトを作成するNSDecimalNumber必要があります (それらが提供する計算の精度が必要なため) が、計算では、おそらく自動解放される NSDecimalNumber オブジェクトが返されることに注意してください。

私の質問は、多くの計算を実行する可能性のある iPhone アプリケーションでこれが潜在的に問題になるかどうかです。

問題は、特に NSDecimalNumber に関連するだけでなく、iPhone アプリケーションの開発中に自動解放されたオブジェクトの作成が避けられない場合があることです。

この点に関する詳細な回答をいただければ幸いです。

4

4 に答える 4

8

独自のオブジェクトを作成できることを忘れないでください。NSAutoreleasePool

例えば:

for (int i = 0; i < 1000; ++i) {
  NSAutoreleasePool * p = [[NSAutoreleasePool alloc] init];
  for (int j = 0; j < 1000; ++j) {
    NSString * s = [NSString stringWithFormat:@"%d,%d", i, j];
    NSLog(@"%@", s);
  }
  [p release];
}

これを行うと、一度に 1000 個を超える文字列がメモリに保持されることはありません。

于 2010-01-05T22:48:48.067 に答える
7

はい、iPhone で多くの自動解放されたインスタンスを作成すると、特にタイトなループでメモリの問題が発生する可能性があります。そのため、可能な場合は回避する傾向があります。これを管理するために独自の自動解放プールを作成できますが、パフォーマンスのオーバーヘッドと、追跡する必要がある追加のコードも追加されます。

このため、高精度の計算を行う場合、NSDecimalNumbers の代わりに NSDecimal C 構造体を使用する傾向があります。実際、これについていくつかのベンチマークを実行したところ、C 構造体を使用するとパフォーマンスが大幅に向上することがわかりました (こちらの回答からコピー):

NSDecimal

Additions per second: 3355476.75
Subtractions per second: 3866671.27
Multiplications per second: 3458770.51
Divisions per second: 276242.32

NSDecimalNumber

Additions per second: 676901.32
Subtractions per second: 671474.6
Multiplications per second: 720310.63
Divisions per second: 190249.33

ご覧のとおり、NSDecimal パスと NSDecimalNumber パスの間で計算速度がほぼ 5 倍向上しています。NSDecimal と NSDecimalNumber の計算の最大の違いは、NSDecimalNumber インスタンスのメモリ割り当てです。したがって、できる限り自動解放された一時的なインスタンスを割り当てることは避けてください。

于 2010-01-05T22:54:14.277 に答える
3

あまりにも多くの自動解放されたオブジェクトを処理することが心配な場合は、独自の自動解放プールを作成できます (メモリ管理を参照):

for (count = 0; count < limit; count++)
{
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
    NSString *fileContents;
    NSString *fileName;

    fileName = [args objectAtIndex:count];
    fileContents = [[[NSString alloc] initWithContentsOfFile:fileName] autorelease];
    // this is equivalent to using stringWithContentsOfFile:

    /* Process the file, creating and autoreleasing more objects. */

    [loopPool release];
}
于 2010-01-05T22:53:01.813 に答える
0

メモリのチャンクを与えられたすべてのオブジェクトは、それを放棄する必要があります。問題はいつです。

alloc/init/releaseオブジェクトが必要な間だけぶらぶらするように、できる限りそうするようにしています。

使用するautoreleaseと、オブジェクトがいつ解放されるかを制御できなくなります。アプリケーションがリリースされたオブジェクトにアクセスしようとすると、クラッシュする可能性があります。ですから、より厳密なメモリ管理は良いことだと思います。

メソッドから返された自動解放されたオブジェクトを保持している限り、問題はありません。(それ以外のことを尋ねている場合を除きます。その場合は、事前にお詫び申し上げます。)

于 2010-01-05T22:45:46.990 に答える