Почему объект деинициализируется, когда ActiveReferenceCount> 0 - PullRequest
0 голосов
/ 14 мая 2018

Я читаю о ARC и не понимаю, как увеличить Reference Count. Мой пример кода ниже.
Мой первый класс:

class Owner{
var name: String
weak var cat:Cat? //Cat reference count will not increase because of 'weak'
init(name: String){
    self.name = name
    print("Owner class is initialized.")
  }

deinit{
    print("Owner class is deinitialized.")
  }  
}

Мой второй класс:

class Cat{
var name: String
var owner: Owner?

init(name: String){
    self.name = name
    print("Cat class is initialized.")
  }

deinit {
    print("Cat class is deinitilized.")
  }
}

Код использования My Class:

var mamun: Owner? = Owner(name: "Mamun") //OwnerAR = 1
var vutu: Cat? = Cat(name: "Vutu") // CatAR = 1
mamun?.cat = vutu // CatAr = 1
vutu?.owner = mamun // OwnerAR = 2
mamun = nil // OwnerAR = 1
vutu = nil // CatAR = 0

Выход:

Класс владельца инициализирован.
Класс Cat инициализирован.
Кошачий класс неинициализирован.
Класс владельца деинициализирован.

Confution: Когда Owner счетчик ссылок равен 1, почему он деинициализируется после выполнения vutu = nil кода. Я делаю неправильно при подсчете ссылки?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

mamun? .Cat = vutu // CatAr = 1 (1 by vutu)

vutu? .Owner = mamun // OwnerAR = 2 (1 by vutu's owner and another by mamun)

Мамун = ноль // OwnerAR = 1 (1 by vutu's owner) == cannot deinit until vutu deinit

vutu = ноль // CatAR = 0 == vutu deinit == OwnerAR = 0 == mamun deinit

0 голосов
/ 14 мая 2018

Когда вы устанавливаете vutu в nil, счетчик ссылок этого объекта обнуляется и деинициализируется, как и ожидалось. В процессе деинициализации он выпускает любые сильные ссылки на объекты, которые у него есть. Так что его owner выпущен. В результате счетчик ссылок становится равным 0 для объекта, на который ссылается ваша переменная mamun. И именно поэтому вы видите последнее сообщение Owner class is deinitialized..

...