iOS: В чем разница между ARC и MRC, когда для объекта установлено значение nil?
В MRC в iOS, когда для объекта установлено значение nil,
myObject = nil;
Сообщается, что произойдет утечка памяти, поскольку myObject не будет указывать на адрес памяти. Память, на которую он указывал раньше, будет потеряна. Итак, нам нужно освободить myObject, и только тогда мы сможем установить nil. Может ли кто-нибудь помочь мне понять, что произойдет, если мы установим nil для myObject в ARC? Если у нас будет что-то подобное
myObject = SomeObject(value:10);
SomeObject myObject_another = myObject;
myObject = nil;
- Будет ли ARC звонить
[myObject release]
когда мы устанавливаемmyObject = nil
? - Приведет ли это к утечке памяти?
- Он позвонит
[myObject_another release]
также когда мы устанавливаемmyObject = nil
?
Пожалуйста, помогите мне понять разницу между ARC и не-ARC.
1 ответ
Вы можете подумать, что компилятор вставляет сохраняет / освобождает каждый раз, когда новая ссылка создается / уничтожается (или переназначается). Так это будет выглядеть:
myObject = SomeObject(value:10); /// Memory allocated and ref count increased.
SomeObject myObject_another = myObject; /// ref count increased (now 2).
myObject = nil; /// Reassigning -> ref count decreased. SomeObject still alive.
...
/// When myObject_another is destroyed or reassigned ref count will be decreased. It's 0 now -> memory deallocated.
- Да. Релиз вызван: уменьшено количество ссылок. Память НЕ освобождается.
- Никакой утечки памяти здесь нет.
- Нет. Объект все еще жив и доступен через myObject_another.
Статья Apple: https://developer.apple.com/library/archive/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html