在Xcode 10 Beta 6游乐场中没有调用Deinit方法

问题描述 投票:1回答:1

我正在探索内存管理概念,并发现deinit方法不是在Xcode 10 beta 6操场中调用。最初我认为可能是代码中的一些问题。然后我在Xcode 9.4.1 playground和Xcode 10 beta 6示例应用程序中测试相同的代码,一切都按预期工作(deinit方法被调用)。它是Xcode 10 beta 6游乐场或其他任何东西的错误吗?我正在使用苹果开发者的代码 -

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
}
ios swift xcode10
1个回答
2
投票

这个问题似乎仍然出现在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中,Car和Person的deinit都被执行,但是在Xcode 10.0(10A255)中,Person的deinit方法没有被执行。

测试macOS项目中的相同代码在Xcode 9.4.1以及Xcode 10.0(10A255)中按预期工作(两者都是deinit执行)

© www.soinside.com 2019 - 2024. All rights reserved.