Автозапуск пулов в Objective-C - выпуск основного AutoreleasePool? - PullRequest
6 голосов
/ 18 декабря 2011

Насколько я понимаю, когда объекту отправляется сообщение autorelease, если нет пулов авто-релиза, кроме пула в main.m, объект помещается в один в main.m.Если предположить, что это правильно, у меня есть пара вопросов:

1) Все ли автоматически выпущенные объекты остаются в этом пуле до завершения работы приложения?

2) Если 1 имеет значение true, создает ли объект с автоматическим выпуском без локального пула автоматического выпуска (следовательно, помещая этот объект в пул main.m), сохраняет этот объект в памяти до тех пор, пока приложение не будет закрыто или не появится предупреждениеполучено?

3) Когда очищается пул автоматического выпуска main.m, кроме случаев, когда приложение получает предупреждение о памяти или приложение закрывается?

Например, в методе делегата cellForRowAtIndexPath, таком как этот:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"];
if (cell == nil) {
    // No cell to reuse => create a new one
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Foobar"] autorelease];

    // lots of custom stuff
}

return cell;

когда клетки на самом деле освобождаются?Они должны быть автоматически освобождены, потому что вы не можете освободить их до того, как вернете их, и вы не можете освободить их после, потому что они находятся вне области видимости.Насколько я понимаю, клетки помещаются в самый верхний пул авто-релиза и освобождаются, когда этот пул осушается / высвобождается.В этом случае это будет единственный пул авто-релиза в приложении;один в main.

4) Проблема в том, что даже когда я закончу с этими ячейками и контроллер представления будет освобожден, ячейки останутся в памяти, да?Если это не так, может ли кто-нибудь объяснить, как на самом деле работает управление памятью в этой ситуации?Спасибо!

Примечание. Я посмотрел документацию Apple, но в основном речь идет о том, когда использовать свои собственные локальные пулы автоматического выпуска, но не о том, как они на самом деле функционируют.

Ответы [ 2 ]

7 голосов
/ 18 декабря 2011

Из документации :

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

5 голосов
/ 18 декабря 2011

1) Все ли автоматически выпущенные объекты остаются в этом пуле до завершения работы приложения?

Автоматически выпущенные объекты по определению принадлежат их пулу автоматического выпуска, пока этот пул не будет удален.Когда вы отправляете -autorelease объекту, этот объект добавляется в список объектов, которые пул выпустит позже.Пулы автоматического выпуска организованы в стек, причем пул в верхней части стека является пулом, в который добавляются любые объекты, отправленные -autorelease.Пул, созданный в main(), обычно не является пулом на вершине стека.Например, цикл выполнения будет создавать пул авто-релиза в начале каждой итерации.

2) Если 1 имеет значение true, то создает ли авто-релизный объект без локального пула авто-релиза (следовательно, помещает этот объект восновной пул) хранит этот объект в памяти до тех пор, пока не будет завершено приложение или не будет получено предупреждение о памяти?

Это было бы, если бы пул, созданный в main(), был самым верхним пулом, но, как описановыше, это обычно не так.

3) Когда истощается пул автоматического выпуска main.m, за исключением случаев, когда приложение получает предупреждение о памяти или приложение закрывается?

Нет никакой разницы между пулом, созданным в main(), и любым другим пулом автоматического выпуска.Все они опустошаются при освобождении пула или в конце блока, если вы использовали директиву @autorelease.

...