2

我有这些课程:

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 函数

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

4

1 回答 1

6

只要没有其他引用对其持有的值,弱属性就会变为 nil。在您的代码中,您将新创建的专辑值分配给它,并且不要将其存储在其他任何地方。

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

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

于 2016-02-26T00:52:14.693 回答