Как поток связан с его пулом NSAutorelease?

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

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

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

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

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

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

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

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

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

[Здесь неправильная часть исправлена ​​в, РЕДАКТИРОВАТЬ]

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

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

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

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

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

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

1 ответ

Решение

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

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

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

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

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

РЕДАКТИРОВАТЬ

Чтобы обратиться к вашему редактированию:

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

Итак, сценарий таков:

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

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

Другие вопросы по тегам