代码之家  ›  专栏  ›  技术社区  ›  Mohammadalijf

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

  •  2
  • Mohammadalijf  · 技术社区  · 8 年前

    我有这些课程:

    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=“”我得到:

    展开可选值时意外发现nil

    deinit函数在Song类中调用init一次

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

    1 回复  |  直到 8 年前
        1
  •  6
  •   Vladimir    8 年前

    一旦没有其他属性,弱属性就变为零 坚强的 引用它所持有的值。在您的代码中,您将新创建的相册值分配给它,而不会将其存储在其他任何地方。

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

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