Как ссылки на объекты в пуле автоматического выпуска? - PullRequest
1 голос
/ 28 апреля 2009

Мне интересно, содержит ли пул авто-релиз сильные или слабые ссылки на объекты, которые он содержит. Я думаю, они слабые. Когда я добавляю объект в пул автоматического выпуска, он просто не сразу освобождается, а будет освобожден при его удалении, верно? Таким образом, ссылки должны быть слабыми, т. Е. Счетчик ссылок (или сохранить счетчик) остается неизменным, когда я добавляю объект в пул автоматического выпуска?

Ответы [ 4 ]

6 голосов
/ 28 апреля 2009

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

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

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

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

2 голосов
/ 28 апреля 2009

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

1 голос
/ 28 апреля 2009

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

id obj = [[NSObject alloc]init];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
    [obj autorelease];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
0 голосов
/ 05 февраля 2015

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

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

...