0

次の2つのコードスニペットにパフォーマンス上の違いはありますか?

NSString* str = [[NSString alloc] initWithFormat:@"%i", 10];
// Do something with |str|.
[str release];

NSAutorelasePool* pool = [[NSAutreleasePool alloc] init];
NSString* str = [NSString stringWithFormat:@"%i", 10];
// Do something with |str|.
[pool drain];

可能な限りファクトリメソッドの使用を提案しようとしている人がいます。プールが空になったときよりも、できるだけ早くオブジェクトを解放する方が良いのではないでしょうか。タイトループなどの特定のケースでは、最初のタイプが非常に効率的であることがわかります。

4

2 に答える 2

2

可能なファクトリーメソッドの使用を提案しようとしている人がいます。

それは基本的に同じことだからだと思いますが、オブジェクトを解放することを覚えておく必要はありません。特に、一連の -release メッセージですべてのメソッドを終了する必要がないため、便利なメソッドを使用する方が少し読みやすいと言う人もいるかもしれません。

プールが空になったときよりも、できるだけ早くオブジェクトを解放する方がよいのではないでしょうか。

ループ内など、状況によってはそのケースを作成できます。多くの場合、これは重要な考慮事項ではありません...多くのメソッドはまったくループせず、ほんの一握りのオブジェクトしか作成しません。

タイトループなどの特定のケースでは、最初のタイプが非常に効率的であることがわかります。

もちろん。そのため、オブジェクトを自動解放するのが適切な場合とそうでない場合を知っておく必要があり、それに応じてコードを記述する必要があります。しかし、常に便利なメソッドを使用しようとするのが理にかなっている以上に、常にオブジェクトの自動解放を避けるように努めるべきだということにはなりません。

ところで、何度も反復するループを作成している場合は、自動解放プールの作成を検討する必要があります。ループ内で他のメソッドを使用している可能性があり、それらのメソッドは自動解放されたオブジェクトを作成する可能性があります。独自のプールを使用して定期的に排出することで、それらのオブジェクトが積み重なるのを防ぎます。ただし、これを行うと、自動解放されたオブジェクトをループ内で使用してはならないという考えからかなりの風が吹いてきます。

于 2011-03-27T10:03:30.730 に答える
0

はい、そうです。最初のものはより良いメモリ管理です。あなたが言ったように、次のプールのドレインの前に多くの割り当てを避けるためにループでそれを行っている場合は価値があります。

于 2011-03-27T09:48:00.353 に答える