class Test {
var title: String
init(title: String) {
self.title = name
println("class is init")
}
deinit {
println("Class is released")
}
}
var test = Test(name: "Hemingway") //output: "class is init"
test = nil //output: "Class is released"
class User {
var name : String
var lover: User?
init(_ name: String){
self.name = name
}
func setLover(_ user: User) {
lover = user
}
deinit {
print("deinit: \(self.name)")
}
}
var A = User("A")
var B = User("B")
A.setLover(B) //互相引用, reference cycle
B.setLover(A)
A = nil // 因為B.lover引用了A, 所以a不會正確被釋放
print(B?.lover!) //此時A還存在
B = nil // 因為B也等於nil了, 沒有人可以再參考到A.lover與B.lover, 記憶體永遠無法被釋放了
Solution:
在 A = nil 之後 把B?.lover也設成nil, 則可以正常釋放記憶體
A = nil
B?.lover = nil // 無人再參考到A, A被回收了
B = nil // B 也可以順利回收了
但有更好的做法, 使用weak關鍵字
class User {
var name : String
weak var lover: User?
init(_ name: String){
self.name = name
}
func setLover(_ user: User) {
lover = user
}
deinit {
print("deinit: \(self.name)")
}
}
var A = User("A")
var B = User("B")
A.setLover(B) //互相引用, reference cycle
B.setLover(A)
A = nil // B.lover引用了A, 但因為是weak, 所以也會被釋放
print(B?.lover!) //此時A不存在了
B = nil // A, B皆釋放了