星空千羽 2021-07-19 00:55 采纳率: 0%
浏览 37

关于Swift弱引用的问题


class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    weak var tenant: Person?
    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
// 打印“John Appleseed is being deinitialized”

unit4A!.tenant

Swift官方文档里说,把变量john赋值为nil,unit4A!.tenant对它的弱引用就会消失,unit4A!.tenant的值会变成nil,然而并没有变成nil。求解🙏

  • 写回答

1条回答 默认 最新

  • 大熊猫侯佩 iOS开发领域优质创作者 2022-11-15 10:30
    关注

    你是在Playground里测试的吗?如果是,请更改为如下代码测试:

    PlaygroundPage.current.needsIndefiniteExecution = true
    
    class Person {
        let name: String
        init(name: String) { self.name = name }
        var apartment: Apartment?
        deinit { print("\(name) is being deinitialized") }
    }
    
    class Apartment {
        let unit: String
        init(unit: String) { self.unit = unit }
        weak var tenant: Person?
        deinit { print("Apartment \(unit) is being deinitialized") }
    }
    
    var john: Person?
    var unit4A: Apartment?
    
    func test() {
        john = Person(name: "John Appleseed")
        unit4A = Apartment(unit: "4A")
    
        john!.apartment = unit4A
        unit4A!.tenant = john
    
        john = nil
        // 打印“John Appleseed is being deinitialized”
    }
    
    test()
    unit4A!.tenant
    

    可以看到最后 unit4A!.tenant 为 nil。

    img

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月19日
  • 修改了问题 7月19日
  • 修改了问题 7月19日
  • 创建了问题 7月19日

悬赏问题

  • ¥15 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波