2016-02-26 75 views
0

我有这些类:弱财产给我,当我试图访问它迅速无

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) 
    } 
} 

这应该工作正常,但每当我试图设置专辑标题从一首歌曲例如我得到零误差专辑 例如,如果下面的执行代码:当尝试

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

!荷兰国际集团以s.album .title伪=“”我得到:

意外发现零而展开的可选值呼吁初始化宋类

DEINIT函数一次

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

+0

我还在访问相册属性之前放置了一些断点。它不给我零,但只要我尝试访问它,它成为无 – Mohammadalijf

回答

4

一旦没有其他引用其所持有的价值,弱财产将变为零。在您的代码中,您为其分配了新创建的相册值,并且不会将其存储在其他任何地方。

所以你弱财产保持专辑实例的唯一参考,它将在赋值后立即成为零。

修复将取决于您使用/构建数据的方式。如果“专辑”存储对其歌曲的引用,则应先创建并存储专辑对象,然后用它初始化其歌曲。 如果专辑没有提及它的歌曲(这可能会很奇怪),那么你可以让专辑变强。

+0

感谢您的答案。我如何修复我的代码?我应该使用弱还是只删除它? – Mohammadalijf

+0

即时通讯创建歌曲和专辑在调度队列,所以它会成为零后,它完成加载歌曲 – Mohammadalijf