Когда проверка iOS сохраняет таблицу подсчета во время выполнения

Я читал, что (из книги, написанной Кадзуки Сакамото и Томохико Фурумото) во время выполнения iOS поддерживает hashtable с адресом объекта в качестве ключа, а этот объект сохраняет счет как значение.

Как показано ниже:

key(object's addr)       value(reference count)

0x7fff59a7ba88           2

0x7fa84b4b2c10           0
...

И среда выполнения iOS будет проверять таблицу один раз, чтобы увидеть, равен ли какой-либо ключ со значением нулю, что означает, что некоторые объекты должны быть освобождены, затем iOS удалит эту пару ключ-значение из таблицы и вызовет dealloc для освобождения памяти объекта.

Если эта теория верна, то мой вопрос в том, в какое время, с какой периодичностью система будет проверять reference count hashtable? Каждый runloop? Или iOS вообще не будет проверять таблицу, а только автоматически?

ОБНОВИТЬ:

Я только что исправил свое описание, которое не должно иметь ничего общего с ARC или MRC, оно больше касается подсчета ссылок во время выполнения.


person Boris    schedule 19.07.2016    source источник
comment
Это не похоже на ARC, это похоже на пул авторелиза.   -  person rmaddy    schedule 19.07.2016
comment
@rmaddy на самом деле это основной механизм ARC во время выполнения, иначе как система будет отслеживать количество сохранений каждого объекта? Он должен хранить счетчики удержания где-то в некоторой структуре данных, чтобы он мог проверять и работать. Он использует таблицу ARC, но когда? Это мой вопрос.   -  person Boris    schedule 19.07.2016
comment
Нет. Отслеживание счетчика удержания не имеет ничего общего с ARC. У объектов был счетчик сохранения задолго до ARC. Единственное, что добавляет ARC, это автоматическая вставка вызовов retain и release компилятором. Коды ARC и MRC одинаковы во время выполнения. Когда счетчик сохранения объекта становится равным нулю, он освобождается (ARC или MRC).   -  person rmaddy    schedule 19.07.2016
comment
@rmaddy да, таблица, которую я упомянул, не относится к ARC или MRC, но именно так iOS управляет памятью и как iOS сохраняет или освобождает объекты во время выполнения в соответствии со счетчиками сохранения от компилятора. Я отредактирую свой вопрос для исправления.   -  person Boris    schedule 19.07.2016
comment
Аналогичным случаем может быть weak table, который поддерживает адреса объектов как ключи и их weak переменные, которые указывают на них как значения.   -  person Boris    schedule 19.07.2016


Ответы (1)


Такое поведение больше похоже на сборку мусора, и это не совсем то, как работает ARC.

Поведение ARC полностью детерминировано: он отслеживает количество strong ссылок на объект, и как только это количество достигает 0, объект немедленно освобождается. Подробнее о реализации можно прочитать здесь.

person caughtinflux    schedule 19.07.2016
comment
Я понимаю, что делает ARC/MRC во время компиляции, но что делает iOS во время выполнения для управления памятью? Разве нет таблицы для записи всей используемой памяти и счетчиков ссылок? В любом случае table вещь читается из книги. - person Boris; 19.07.2016
comment
Всякий раз, когда вызывается -release, среда выполнения проверяет счетчик ссылок. Он не опрашивает счетчик ссылок, как вы думаете. - person caughtinflux; 19.07.2016
comment
Этот ответ вводит в заблуждение. Это не относится к ARC. Это описание в равной степени относится и к MRC. - person rmaddy; 19.07.2016
comment
Вы правы: может быть, мне стоит уточнить, что это автоматически? И что компилятор делает это через objc_release() и других? - person caughtinflux; 20.07.2016
comment
На самом деле я хотел знать, что, согласно @caughtinflux, всякий раз, когда вызывается release, среда выполнения будет проверять счетчик ссылок. Да, это не относится ни к ARC, ни к MRC, это общая идея управления памятью. И я уже отредактировал свой вопрос и описание, чтобы не вводить здесь в заблуждение. - person Boris; 21.07.2016