1

私がゲームを開発しているとしましょう。次のクラス メソッドを何千回も実行します。

NSBundle *bundle=[NSBundle mainBundle];

自動解放プールを作成せず、上記のクラス メソッドを呼び出すオブジェクトを常に解放します。オブジェクトを作成し、それが上記のクラス メソッドを呼び出し、それを解放し、何度も何度も繰り返します。

3 つの質問:

  • メモリリークですか?
  • 私が走った場合:

NSAutoReleasePool *pool=[[NSAutoReleasePool alloc] init]; [プールドレイン];

クラスメソッドで作成されたすべてのNSBundleを効果的に解放しますか?

  • 私が書いた場合:

プール=ゼロ;

書く代わりに:

[プールドレイン];

同じ効果が得られるでしょうか?これは良い習慣ですか?

3つの質問は相関しており、それらを明確にするものを後押しします:)

4

2 に答える 2

0
  1. いいえ、メモリはリークしていません。[NSBundle mainBundle]自動解放されたオブジェクトを返すため、自動解放プールが処理します。ただし、1 つの関数などで何度も呼び出す場合は、一度参照を取得して必要な間だけ保持するか、独自の自動解放プールを作成することをお勧めします。 .
  2. ではない正確に。NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];その後自動解放されたものはすべて に入りpool、プールを空にした後、それらは解放されます。注:[pool drain];もプールを解放するため、呼び出さないでください。そうしないと[pool drain]; [pool release];releaseメッセージがオブジェクトに 2 回送信され、おそらくクラッシュします。
  3. いいえ。pool = nil;への参照が失われpool、実際のpoolオブジェクトがリークされます。[pool drain];またはのいずれかを呼び出す必要があり、後で[pool release];設定することをお勧めします。pool = nil;
于 2010-08-14T02:30:31.123 に答える
0

自動解放プールを作成せず、まだ存在していない場合は、自動解放されたオブジェクト (ユーザーまたは使用している他のライブラリによって) がリークされます。

設定プール=nil; おそらくプールがプロパティに設定されている場合、プール全体をリークする以外は何もしません。

 @property(nonatomic, retain) NSAutoreleasePool *pool;

 self.pool = [[[NSAutoreleasePool alloc] init] autorelease];

 //now, self is the sole retainer of pool, so if self abandons it it gets drained:

 self.pool = nil;

 //pool's retain count drops to zero, pool drains.

これを何千回も実行している場合、毎回プールを空にするために処理が遅くなる可能性があります。5 回または 10 回ごとに実行することを検討し、ループにカウンターを設定して、決定された数に達したら、次のようにします。

 self.pool = [[[NSAutoreleasePool alloc] init] autorelease];
 //this will get rid of the old pool and put in a new one, so you only have to get rid of the one remaining at the end of the loop.
于 2010-08-14T05:08:53.177 に答える