![](/img/trans.png)
[英]Memory leaks in the swift playground / deinit{} not called consistently
[英]Deinit method is not called in Xcode 10 Beta 6 playground
我正在研究內存管理概念,發現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
}
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.