Ответ
ARC (Automatic Reference Counting) автоматически вставляет вызовы retain и release, отслеживая время жизни сильных (strong) ссылок на объекты.
Правила вставки:
retain: Вставляется при присваивании объекта сильной ссылке (переменной, свойству, константе). Увеличивает счетчик ссылок.release: Вставляется в двух случаях:- Когда сильная ссылка перезаписывается другим значением (или
nil). - Когда сильная ссылка выходит из области видимости (например, завершается функция).
- Когда сильная ссылка перезаписывается другим значением (или
Пример трассировки:
class MyClass {}
func example() {
// Область видимости начинается
var obj1: MyClass? = MyClass() // ARC: retain для нового объекта
var obj2: MyClass? = obj1 // ARC: retain (присваивание obj1 в obj2)
obj1 = nil // ARC: release для obj1
// Объект еще жив, так как на него ссылается obj2
obj2 = MyClass() // ARC: release для старого объекта, retain для нового
// Старый объект уничтожается здесь (счетчик = 0)
} // ARC: release для obj2 (для нового объекта) при выходе из области видимости
Особые случаи:
weakссылки: Не вызываютretain, поэтому не влияют на счетчик. ARC автоматически обнуляет (nil)weak-переменную послеreleaseпоследней сильной ссылки.unownedссылки: Также не вызываютretain, но не обнуляются. Ответственность за обеспечение времени жизни объекта лежит на программисте.- Циклы сильных ссылок: ARC не может их разорвать, что приводит к утечкам памяти. Решение — использование
weakилиunowned.