ARC 如何处理强制解包实例
How ARC act with force unwrapped instance
我正在尝试了解 ARC 的确切工作原理,所以我阅读了 Swift ARC documentation 并遵循了他们在文档中使用 playground 提供的示例:
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
对象被释放,但当我调用它时强制展开:
john!.apartment = unit4A
它不会被释放。
在一个简单的 Xcode 项目中测试您的代码工作正常,这是一个与 playgrounds 处理对象相关的问题。
然而,当 deinit
没有被调用时,它可能是一个保留周期问题,
因为 ARC 无法释放强引用,因此不会被释放。
看看这个 .
另请阅读有关保留周期的更多信息 here
我正在尝试了解 ARC 的确切工作原理,所以我阅读了 Swift ARC documentation 并遵循了他们在文档中使用 playground 提供的示例:
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
对象被释放,但当我调用它时强制展开:
john!.apartment = unit4A
它不会被释放。
在一个简单的 Xcode 项目中测试您的代码工作正常,这是一个与 playgrounds 处理对象相关的问题。
然而,当 deinit
没有被调用时,它可能是一个保留周期问题,
因为 ARC 无法释放强引用,因此不会被释放。
看看这个
另请阅读有关保留周期的更多信息 here