电弧如何用强迫未包装的实例发挥作用



我正在尝试学习弧的工作原理,因此我阅读了Swift Arc文档,并遵循了他们使用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项目中测试您的代码工作正常,这是与操场处理对象有关的问题。

但是,当deinit不称为其保留周期问题时因为 arc 无法处理强引用,因此不会被划分。

查看此答案。
还可以在此处阅读有关保留周期的更多信息

相关内容

  • 没有找到相关文章

最新更新