Обработка пусков и выпусков AutoRelease - PullRequest
1 голос
/ 25 августа 2011

Если я создаю поток с обратным вызовом наподобие ..

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

Я предполагаю, что все автоматически освобожденные данные никогда не будут освобождены, поскольку пул никогда не очищается.Я мог бы изменить ситуацию так, чтобы это выглядело так:

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

Но это кажется немного расточительным для размещения / удаления так часто.Есть ли способ, которым я могу выделить блок памяти и освободить пул после его заполнения?

Ответы [ 2 ]

7 голосов
/ 25 августа 2011

Не беспокойтесь об этом, потому что Autorelease - быстрый . Ваш второй вариант в порядке. И на самом деле, в ARC будет сложно что-либо сделать, кроме этих двух вариантов, из-за нового синтаксиса @autoreleasepool { }.

1 голос
/ 25 августа 2011

Если вы выделяете значительный * объем автоматически высвобождаемой памяти на каждой итерации цикла, то создание и освобождение нового пула для каждой итерации - это то, что нужно для предотвращения накопления памяти.

Если вы не генерируете много памяти с автоматическим выпуском, это не будет выгодно, и вам понадобится только внешний пул.

Если вы выделите достаточно памяти, чтобы одна итерация была незначительной, но к тому времени вы уже многое сделали, то вы можете создавать и освобождать пул каждые 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];

* Вам нужно определить, что значимо для себя.

...