我正在努力学习ARC是如何工作的,所以我读了qazxsw poi,我按照他们使用playground在文档中提供的示例:
Swift ARC documentation
我的问题是为什么当我调用class Person {
let name: String
weak var apartment: Apartment?
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
weak var tenant: Person?
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) is being deinitialized") }
}
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
实例Person
可选:
john
该对象被取消分配,但当我称之为强制解包时:
john?.apartment = unit4A
它不会被取消分配。
在一个简单的Xcode项目中测试你的代码工作得很好,这是一个与游乐场处理对象有关的问题。
然而,当一个john!.apartment = unit4A
没有被称为它可能是一个保留周期问题时,因为ARC无法解除分配强引用,因此不会被解除分配。
看看这个deinit
。
另请阅读有关保留周期answer的更多信息