1

私がこのようなコードを持っているとしましょう:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
for(unsigned int i=0;i<10;i++)
{
    NSDate* date=[[NSDate alloc]init];
}
[pool drain];

このコードは、私ができることを示すことだけを目的としていることに注意してください。これは、私が通常行うことを単純化したものです。したがって、各反復で、新しいNSDateが割り当てられ、初期化されます。NSAutoreleasePoolはそれらをすべて排出しますか、それとも次のようにループにNSAutoreleasePoolを追加する必要がありますか?

for(unsigned int i=0;i<10;i++)
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    NSDate* date=[[NSDate alloc]init];
    [pool drain];
}


また、私の本(mac os x用のココアプログラミング)ではNSAutoreleasePoolについては触れられておらず、次のように使用されています。

@autoreleasepool
{
    <code>
}

この方法はNSAutoreleasePoolを使用するよりも効率的であると読みましたが、使用すると構文エラーが発生します:
「プログラム内の予期しない'@'」
なぜこれですか?

私はこのようにコードを変更しようとしました:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
for(unsigned int i=0;i<10;i++)
{
    NSDate* date=[[NSDate alloc]init];
    [date autorelease];
}
[pool drain];

あれは正しいですか?10個の異なるオブジェクトが保持され(1までカウント)、自動解放プールに追加されると思います。メモリリークは発生していませんか?このオブジェクト数をgdbで確認する方法はありますか?

4

2 に答える 2

5

クラスを割り当て/初期化すると、返されるインスタンスは通常、自動解放されません。したがって、その例では、自動解放プールはまったく必要ありません。

一般に、自動リリースプールは、それが必要であることを示す定量化可能なパフォーマンスの問題がある場合にのみ、コードに振りかける必要があります。あなたが持っていない問題を修正しないでください。

が機能しない場合@autoreleasepoolは、古いコンパイラを使用していることが原因です。

于 2012-04-06T21:34:25.697 に答える
0

アップルドキュメントから

If you write a loop that creates many temporary objects.
You may use an autorelease pool block inside the loop to dispose of those objects before the next iteration. Using an autorelease pool block in the loop helps to reduce the maximum memory footprint of the application.

@Ramyが使用するのは良いことではありません:

for(unsigned int i=0;i<10;i++)
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    NSDate* date=[[NSDate alloc]init];
    [date autorelease];
    [pool drain];
}
于 2013-06-12T04:54:44.690 に答える