当我试图快速访问它时,弱属性给我零

时间:2016-02-26 00:47:59

标签: ios swift automatic-ref-counting weak

我有这些课程:

class Song {
    var title : String = ""
    weak var album : Album?

    init() {
        self.album = Album()
    }

}

class Album {
    var title : String = ""
    var Songs : Array < Song > = []
    deinit {
        print(self , self.title)
    }
}

这应该可以正常工作,但每当我尝试从歌曲实例设置专辑的标题时,我的专辑都会出现nil错误 例如,如果执行以下代码:

let s = Song()
s.title = "some title for song"
s.album!.title = "some title for album"

尝试s.album!.title =“”我得到:

  

在解包可选值时意外发现nil

在Song类中调用init的deinit函数

我在这里做错了什么?我应该怎么解决这个问题?

1 个答案:

答案 0 :(得分:4)

只要没有其他引用它所拥有的值,弱属性就会变为零。在您的代码中,您可以为其分配新创建的“专辑”值,而不是将其存储在其他任何位置。

因此,您的弱属性保留了对专辑实例的唯一引用,并且在分配后它将立即变为零。

修复程序取决于您使用/构建数据的方式。如果专辑存储对其歌曲的引用,那么您应首先在某处创建并存储专辑对象,然后使用它来初始化其歌曲。 如果专辑没有对其歌曲的引用(这可能很奇怪),那么你可以让专辑变量变强。