由于 ARC(Automatic Reference Counting)的机制,未声明 weak 的对象均为“强引用“,也就是当相关对象赋值为 nil 时,其并未在内存中销毁。
也就是在下述例子中, blog 和 blogger 均赋值为 nil 时, deinit 函数并未被触发,因为存在 “var owner: Blogger?“ 和 “var blog: Blog?“ 默认的强引用,当将其设为 weak 时 “weak var owner: Blogger?“, 则会触发 deinit 函数。
class Blog {
let name: String
let url: URL
var owner: Blogger?
init(name: String, url: URL) { self.name = name; self.url = url }
deinit {
print("Blog \(name) is being deinitialized")
}
}
class Blogger {
let name: String
var blog: Blog?
init(name: String) { self.name = name }
deinit {
print("Blogger \(name) is being deinitialized")
}
}
var blog: Blog? = Blog(name: "SwiftLee", url: URL(string: "www.avanderlee.com")!)
var blogger: Blogger? = Blogger(name: "Antoine van der Lee")
blog!.owner = blogger
blogger!.blog = blog
blog = nil
blogger = nil