Как поток связан с его пулом NSAutorelease? - PullRequest
1 голос
/ 02 января 2012

У меня есть общее представление о том, как работает пул NSAutorelease.у нас есть объекты, которые автоматически высвобождаются и когда вызывается метод стока.в пуле проверяются объекты с retaincount равным +1, и поэтому они освобождаются.

, но я не уверен в том, что это так.Мы создаем объект пула NSAutoRelease в основном потоке, а также по одному для каждого потока.Как поток связан с этим конкретным пулом.Что произойдет, если мы создадим два или более пула автоматического выпуска в одном потоке.

мы просто создадим объект пула и опустошим его, когда наша работа будет завершена.это не так, что мы получаем синглтон или что-то в этом роде.

Тогда как поток попадает в этот конкретный пул?

Объяснение сценария того, что я подразумеваю под сохранением счетчика 1.[немного неверно, прочитайте правку]

  • Obj A имеет метод createAndReturn.
  • createAndReturn создает объект autorel_obj и возвращает его.

Теперь он не может просто выпустить его, так как должен его вернуть.Таким образом, он будет автоматически освобожден и вернется.

Таким образом, autorel_obj будет в пуле автоматического выпуска.Теперь скажите, что objB вызывает createAndReturn из ObjA.

, получает autorel_obj и сохраняет его, в противном случае пул autorelease его истощит.Теперь, когда он сохраняется объектом objB, его счетчик хранения равен 2.

[ Здесь исправлена ​​неправильная часть, EDIT ]

Автозапуск пула просто не можетвыпускать autorel_obj до тех пор, пока он не будет также использован objB.вот почему, пока objB также не выпустит его и его счетчик хранения не станет равным «1», он не может быть освобожден.

, так что под retainCount 1 я имею в виду, что объект, отправивший его в пул, является единственным владельцем.Это.

и относительно связи с пулом и потоком, был полезен ответ Firoze Lafeer.

РЕДАКТИРОВАТЬ, чтобы сохранить сценарий счетчика 1: Как правильно указал Firoze, Мое более раннее объяснение сохранениясчетчик 1 нуждается в изменении.

autorel_obj будет освобожден только при опустошении пула, и, следовательно, его счетчик сохранится на 1. Он не будет освобожден из памяти.Как только каждый второй владелец obj из autorel_obj освобождает его, и его счетчик хранения становится равным 0. Тогда только он освобождается из памяти.

Извините за все проблемы, Спасибо Firoze за исправление.

1 Ответ

3 голосов
/ 02 января 2012

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

Я не уверен, что полностью понимаю это утверждение, но для меня оно звучит неправильно.В авторелизе нет ничего условного.Если вы автоматически высвобождаете объект, он будет освобождаться при опустошении пула, независимо от его количества сохранений в этой точке (даже если объект уже был освобожден!). Лучше думать об «автоматическом высвобождении» как"отсроченный выпуск".

Что касается другого вопроса, каждый поток поддерживает свой собственный стек пулов авто-выпуска.Каждый пул связан с одним (и только одним) потоком.

С каким потоком связан данный пул?Ответ в том, какой поток создал пул.Если вы создаете новый пул, в котором он уже существует, то новый пул «вложен» в существующий пул.Объекты, автоматически выпущенные в рамках этого нового пула, будут освобождены, когда этот пул будет очищен (когда закончится область действия этого пула).

Надеюсь, это поможет?

EDIT

Чтобы ответить на ваши вопросы:

Ваше объяснение неверно.Пул автоматического освобождения может освободить объект, как только он будет осушен.Он не ждет, когда objB выпустит его первым.Он даже не знает, какие другие объекты могли сохранить autorel_obj из вашего примера.Я думаю, что вы путаете релиз с освобождением.

Сценарий таков:

  • createAndReturn выделяет и автоматически выпускает autorel_obj (количество сохраненных файлов равно + 1 )
  • objB сохраняет autorel_obj (сохранить счет + 2 )
  • пул очищается, autorel_obj освобождается пулом (сохранить счет + 1 )
  • в какой-то момент в будущем, objB выпустит autorel_obj (сохранить количество 0 )
  • autorel_obj освобожден

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

...