Ответ
Счетчик ссылок изменяется при выполнении операций владения. В ручном управлении памятью (MRC) — при явных вызовах. В ARC — при событиях, которые компилятор транслирует в эти вызовы.
Операции, увеличивающие счетчик (retain):
- Присваивание объекта сильной (strong) ссылке.
- Помещение объекта в коллекцию (массив, словарь), которая хранит сильные ссылки.
- Явный вызов
retain(в MRC).
Операции, уменьшающие счетчик (release):
- Сильной ссылке присваивается
nilили другой объект. - Сильная ссылка выходит из области видимости (конец функции, блока).
- Объект удаляется из коллекции.
- Владеющий объект (например, родительский UIView) сам деаллоцируется.
- Явный вызов
release(в MRC).
Псевдокод жизненного цикла в ARC:
// Компилятор генерирует примерно такой код:
class MyObject {}
func createObject() {
let obj = MyObject() // retain(obj) -> count = 1
use(obj)
// Конец области видимости `obj` -> release(obj) -> count = 0 -> deinit
}
Почему это важно: Понимание этих моментов помогает избегать retain cycles (когда два объекта держат сильные ссылки друг на друга, и счетчик никогда не падает до нуля).