Насколько я понимаю, когда объекту отправляется сообщение 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, но в основном речь идет о том, когда использовать свои собственные локальные пулы автоматического выпуска, но не о том, как они на самом деле функционируют.