1

のようなコールバックでスレッドを作成した場合。

NSAutoreleasePool* pool = [NSAutoreleasePool alloc] init];
while(1) {
   //Process Stuff
}
[pool release];

プールが空になることはないので、自動リリースされたものが実際に解放されることはないと思います。私は次のように物事を変えることができます:

while(1) {
   NSAutoreleasePool* pool = [NSAutoreleasePool alloc] init];
   //Process Stuff
   [pool release];
}

しかし、頻繁に割り当て/削除するのは少し無駄に思えます。メモリのブロックを取っておき、プールがいっぱいになったら解放する方法はありますか?

4

2 に答える 2

7

Autorelease は Fastであるため、心配する必要はありません。2 番目のオプションで問題ありません。@autoreleasepool { }実際、ARC では、新しい構文のため、これら 2 つのオプション以外のことを行うのは困難です。

于 2011-08-25T17:37:07.017 に答える
1

ループの反復ごとに大量の自動解放メモリを割り当てる場合は、反復ごとに新しいプールを作成して解放し、メモリが積み重なるのを防ぐのが適切です。

自動解放されたメモリをあまり生成しない場合、それは有益ではなく、外部プールのみが必要になります。

1 回の反復が重要でなくても十分な量のメモリを割り当てる場合は、X 回の反復ごとにプールを作成して解放することができます。

#define IterationsPerPool 10
NSAutoreleasePool* pool = [NSAutoreleasePool new];
int x = 0;
while(1) {
   //Process Stuff
   if(++x == IterationsPerPool) {
      x = 0;
      [pool release];
      pool = [NSAutoreleasePool new];
   }
}
[pool release];

* 自分にとって何が重要かを判断する必要があります。

于 2011-08-25T17:44:49.823 に答える