Как ссылаются на объекты в пуле автозапуска?

Мне интересно, содержит ли пул автозапуска сильные или слабые ссылки на объекты, которые он содержит. Думаю, они слабые. Когда я добавляю объект в пул с автоматическим выпуском, он просто не освобождается сразу, а будет выпущен, когда пул будет опустошен, верно? Значит, ссылки должны быть слабыми, то есть счетчик ссылок (или счетчик сохранений) остается неизменным, когда я добавляю объект в пул автозапуска?


person Thanks    schedule 28.04.2009    source источник


Ответы (4)


Разговор о сильных и слабых ссылках имеет смысл в контексте среды управления памятью со сборкой мусора (где слабые указатели автоматически освобождаются и очищаются, даже если на них есть ссылки). С включенным сборщиком мусора все вызовы сохранения / освобождения / автоматического выпуска по сути ничего не делают (хотя метод NSAutoreleasePool -drain запускает сборку мусора).

Теперь, когда вы пометили этот вопрос как связанный с iPhone, и на iPhone нет сборки мусора, я предполагаю, что вы имеете в виду регулярный подсчет ссылок, под сильным вы подразумеваете увеличение счетчика сохранения объекта, на который ссылаетесь, а под слабым - вы означает просто сохранение значения указателя.

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

Таким образом, ссылка эффективна, но ваш код теряет ответственность и освобождает от ответственности. Объект release будет вызываться при освобождении / опорожнении пула автозапуска.

person duncanwilcox    schedule 28.04.2009

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

person Martin Gordon    schedule 28.04.2009

да. счетчик сохраненных данных остается прежним, и вы можете проверить, что это так:

id obj = [[NSObject alloc]init];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
    [obj autorelease];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
person oxigen    schedule 28.04.2009

Счетчик удержания остается прежним, в основном запуск сообщения автозапуска на объекте освобождает разработчика от ответственности за владение и выпуск.

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

person Sanjay Mohnani    schedule 05.02.2015