iOS: Какая разница в AR C и MR C, когда объект установлен в ноль? - PullRequest
1 голос
/ 27 января 2020

В MR C в iOS, когда объект установлен в ноль,

myObject = nil; 

Сообщается, что произойдет утечка памяти, поскольку myObject не будет указывать по адресу памяти. Память, на которую он указывал раньше, будет потеряна. Поэтому нам нужно освободить myObject, и тогда только мы можем установить nil. Может кто-нибудь помочь мне понять, что произойдет, если мы установим nil в myObject в AR C? Если у нас будет что-то вроде этого

myObject = SomeObject(value:10);
SomeObject myObject_another = myObject;
myObject = nil;
  1. Будет ли AR C вызывать [myObject release], когда мы установим myObject = nil?
  2. Приведет ли это к утечке памяти?
  3. Будет ли он также вызывать [myObject_another release], когда мы установим myObject = nil?

Пожалуйста, помогите мне понять разницу между AR C и не-AR C.

1 Ответ

2 голосов
/ 27 января 2020

Вы можете думать, что вставки компилятора сохраняются / освобождаются каждый раз, когда новая ссылка создается / уничтожается (или переназначается). Так это будет выглядеть:

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. 
  1. Да. Выпуск вызван: количество ссылок уменьшилось. Память НЕ освобождается.
  2. Здесь нет утечки памяти.
  3. Нет. Объект все еще жив и может быть доступен через myObject_another.

Статья Apple: https://developer.apple.com/library/archive/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html# // apple_ref / doc / uid / TP40011226

...