Авто-релиз Утопление - PullRequest
       27

Авто-релиз Утопление

0 голосов
/ 15 августа 2010

Я столкнулся с проблемой, которая, кажется, называется "утопление" в пулах автоматического выпуска.

Мой код правильно создает и уничтожает объекты. Однако я использую некоторые методы класса, которые автоматически высвобождают несколько переменных, не зная об этом. Учитывая, что они повторяются тысячи и тысячи раз в минуту ... Я тону в тысячах невыпущенных объектов, потерянных где-то в программе.

2 вопроса:

  1. Таким образом, либо я не использую методы класса ВСЕ - это постоянное решение, либо, даже если некоторые методы экземпляра (Foundation, UIKit) все еще будут автоматически освобождать объекты без моего ведома об этом? 1010 *

  2. или я могу выделить пул авто-релиза перед вызовом методов класса и опустошением его после вызова методов класса - будет ли это постоянным решением?

Ответы [ 2 ]

2 голосов
/ 15 августа 2010

Дейв Делонг уже ответил на ваши вопросы, но обычно единственный раз, когда вы заполняете бассейн слишком высоко, это когда вы находитесь в очень узком кругу.В этом случае просто создайте новый пул автоматического выпуска для каждой итерации цикла.

for (NSUInteger i = 0; i < 1000000000; i++)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // do the work

    [pool release];
}

Объекты автоматически добавляются в последний созданный пул автоматического выпуска для текущего потока.Создав по одному для каждой итерации цикла, вы можете быстро избавиться от нежелательных объектов, не позволяя им накапливаться в пуле цикла выполнения.

2 голосов
/ 15 августа 2010
  1. Тот факт, что вы не используете метод класса, не означает, что вы собираетесь избегать автоматически выпущенных объектов.Например: NSString * path = [anotherString stringByAppendingPathComponent:@"foo"] возвращает объект автоматического освобождения, но методы класса не задействованы.Насколько я знаю, единственный способ избежать автоматически выпущенных объектов - это не использовать объекты.Если вы действительно хотите пойти по этому пути, посмотрите CoreFoundation.(Я не рекомендую идти по этому пути.)

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

    + (id) crazyFactoryMethodWithFoo:(id)foo {
      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
      id returnValue = nil;
      //generate gobs of autoreleased objects
      returnValue = [something retain];
      [pool release];
      return [returnValue autorelease];
    }

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

...