Быстрые не деинициализирующие случаи - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий код:

class Company {
    let name: String
    var founder: Person?

    init(name: String) {
        self.name = name
        print("\(self.name) was initialized")
    }

    deinit {
        print("\(self.name) was deinitialized")
    }
}

class Person {
    let name: String
    weak var company: Company?

    init(name: String) {
        self.name = name
        print("\(self.name) was initialized")
    }

    deinit {
        print("\(self.name) was deinitialized")
    }
}

var mark: Person?
var facebook: Company?

mark = Person(name: "Mark Zuckerberg")
facebook = Company(name: "Facebook")
mark!.company = facebook
facebook!.founder = mark

facebook = nil
mark = nil

У меня слабая ссылка на человека, но все равно кажется, что есть цикл сохранения, потому что ни один из этих примеров не деинициализирован. Он печатает оператор инициализации, но не деинициализирующий.

Выход:

Mark Zuckerberg was initialized
Facebook was initialized

1 Ответ

0 голосов
/ 07 ноября 2018

В этом примере, если вы присваиваете переменные объекта с необязательной цепочкой и создаете их экземпляры внутри блока кода, они будут деинициализированы при отсутствии ссылки strong на этот объект. Документация ARC

class Company {
    let name: String
    var founder: Person?

    init(name: String) {
        self.name = name
        print("\(self.name) was initialized")
   }

    deinit {
        print("\(self.name) was deinitialized")
    }
}

class Person {
    let name: String
    weak var company: Company?

    init(name: String) {
        self.name = name
        print("\(self.name) was initialized")
    }

    deinit {
        print("\(self.name) was deinitialized")
    }
}

do{
    var mark: Person?
    var facebook: Company?

    mark = Person(name: "Mark Zuckerberg")
    facebook = Company(name: "Facebook")
    mark?.company = facebook
    facebook?.founder = mark
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...