Метод Deinit не вызывается на игровой площадке Xcode 10 Beta 6 - PullRequest
0 голосов
/ 25 августа 2018

Я изучал концепцию управления памятью и обнаружил, что deinit метод не вызывает в Xcode 10 beta 6 детская площадка .Первоначально я думал, что могут быть некоторые проблемы в коде.Затем я тестирую один и тот же код на детской площадке Xcode 9.4.1 и в образце приложения Xcode 10 beta 6, все работает как положено (вызывается метод deinit).Это ошибка на Xcode 10 beta 6 или что-то еще?Я использую код разработчика Apple -

class Person {
    let name: String
    weak var apartment: Apartment?

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

    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    weak var tenant: Person?

    init(unit: String) { self.unit = unit
        print("Apartment \(unit) is being initialized")
    }
    deinit { print("Apartment \(unit) is being deinitialized") }
}

do {
    var john: Person?
    var unit4A: Apartment?
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")

    john!.apartment = unit4A
    unit4A!.tenant = john
    john = nil 
    unit4A = nil
}

1 Ответ

0 голосов
/ 18 сентября 2018

Эта проблема, кажется, все еще присутствует в Xcode 10.0 (10A255). У меня есть детская площадка со следующим кодом:

class Person {
    var name: String

    func buy(car: Car) {
        car.owner = self
    }

    init(name: String) {
        self.name = name
        print("Person \(name) is initalized")
    }

    deinit {
        print("Person \(name) is being deinitialized")
    }
}


class Car {
    let model: String
    weak var owner: Person?

    init(model: String) {
        self.model = model
        print("Car \(model) is initialized")
    }

    deinit {
        print("Car \(model) is being deinitialized")
    }
}

print("===== before do =====")
do {
    print("    ---- do begin -----")
    let johnny = Person(name: "John")
    let porsche = Car(model: "Carrera4")
    johnny.buy(car: porsche)
    print("    ---- do end -----")
}
print("===== after do =====")

В Xcode 9.4.1 выполняются deinit и Car, и Person, но в Xcode 10.0 (10A255) метод deinit Person не выполняется.

Тот же код внутри тестового проекта MacOS работает как положено (оба выполняются deinit) в Xcode 9.4.1, а также в Xcode 10.0 (10A255)

...