Мне интересно, содержит ли пул автозапуска сильные или слабые ссылки на объекты, которые он содержит. Думаю, они слабые. Когда я добавляю объект в пул с автоматическим выпуском, он просто не освобождается сразу, а будет выпущен, когда пул будет опустошен, верно? Значит, ссылки должны быть слабыми, то есть счетчик ссылок (или счетчик сохранений) остается неизменным, когда я добавляю объект в пул автозапуска?
Как ссылаются на объекты в пуле автозапуска?
Ответы (4)
Разговор о сильных и слабых ссылках имеет смысл в контексте среды управления памятью со сборкой мусора (где слабые указатели автоматически освобождаются и очищаются, даже если на них есть ссылки). С включенным сборщиком мусора все вызовы сохранения / освобождения / автоматического выпуска по сути ничего не делают (хотя метод NSAutoreleasePool -drain запускает сборку мусора).
Теперь, когда вы пометили этот вопрос как связанный с iPhone, и на iPhone нет сборки мусора, я предполагаю, что вы имеете в виду регулярный подсчет ссылок, под сильным вы подразумеваете увеличение счетчика сохранения объекта, на который ссылаетесь, а под слабым - вы означает просто сохранение значения указателя.
Метод autorelease
по существу перемещает владение объектом из вызывающего кода в текущий пул автозапуска, вы можете думать о вызывающем коде, вызывающем освобождение, и о сохранении вызывающего пула.
Таким образом, ссылка эффективна, но ваш код теряет ответственность и освобождает от ответственности. Объект release
будет вызываться при освобождении / опорожнении пула автозапуска.
Вся суть пула авторелизов в том, что это отложенный релиз. Например, вы можете вызвать autorelease для локального объекта, который вы будете возвращать в методе, чтобы он был освобожден, даже если вы потеряете ссылку на объект при возврате метода.
да. счетчик сохраненных данных остается прежним, и вы можете проверить, что это так:
id obj = [[NSObject alloc]init];
NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
[obj autorelease];
NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
Счетчик удержания остается прежним, в основном запуск сообщения автозапуска на объекте освобождает разработчика от ответственности за владение и выпуск.
Вот как работает пул с автоматическим выпуском: каждый раз, когда создается пул с автоматическим выпуском, он добавляется поверх стека, поэтому система будет использовать самый последний пул с автоматическим выпуском. И всякий раз, когда вы добавляете какой-либо объект в пул автозапуска, он добавляется в верхний пул автозапуска в стеке. Пул с автоматическим выпуском - это, по сути, массив, в который добавляются автоматически выпускаемые объекты. Каждый объект, добавленный в пул с автоматическим выпуском, освобождается, когда этот конкретный пул с автоматическим выпуском освобождается (/ осушается). Пул автозапуска создается до того, как система начинает обрабатывать какое-либо событие, и остается там до завершения текущего цикла событий. Когда система видит, что текущий цикл событий завершен, она получает самый верхний пул автозапуска, связанный с этим циклом событий, и освобождает его. Освобождение пула с автоматическим выпуском / слив означает добавление каждого объекта в пул с автоматическим выпуском и запуск сообщения об освобождении объекта до тех пор, пока не будут освобождены все объекты в пуле с автоматическим выпуском.