Swift 惰性变量和 didReceiveMemoryWarning

Posted

技术标签:

【中文标题】Swift 惰性变量和 didReceiveMemoryWarning【英文标题】:Swift lazy variable and didReceiveMemoryWarning 【发布时间】:2014-10-02 11:15:45 【问题描述】:

我想在 Swift 中懒惰地加载一个 nib 文件,所以我这样做了

lazy var MyNib: UINib?  = 
    let uiNib:UINib = MyClass.nib();
    return uiNib;
    ()

我知道这只会被调用一次。

因此,如果我收到 didReceiveMemoryWarning,测试似乎表明将其设置为 nil 没有任何效果,因为在以后访问它时不会重新初始化,这可以使用 Objective C 属性来完成。

更多的问题是 NSFetchedResultControllers,因为我可能真的希望卸载大量数据,然后在以后重新加载。

如何在 Swift 中实现这一点?

谢谢

【问题讨论】:

【参考方案1】:

作为一种解决方法,您可以使用最初为nil 的支持私有属性,并围绕它实现一个计算属性。计算属性同时实现了 getter 和 setter,getter 检查烘焙属性是否为 nil,如果需要则对其进行初始化。

private var _nib: UINib?

var uiNib: UINib 
    get 
        if _nib == nil 
            _nib = MyTestClass.nib();
        
        return _nib!
    
    set  _nib = nil 

这样,您可以根据需要多次将属性设置为nil,确保下次以读取模式访问它时会再次重新初始化。

请注意,此实现不是线程安全的 - 但很可能只在主线程中使用。

【讨论】:

谢谢。说得通。这让我觉得这是一个比仅仅使用“懒惰”更强大的功能。所以我想知道为什么懒惰甚至应该被打扰???? lazy 的用例是当属性被初始化一次并与类实例的生命周期共享它的生命周期。它在某些情况下很有用,但不是你的 :) 我同意 @Fittoburst 的懒惰,因为“nil”是一个不错的补充。

以上是关于Swift 惰性变量和 didReceiveMemoryWarning的主要内容,如果未能解决你的问题,请参考以下文章

全局变量/常量如何在 swift 中变得懒惰

Swift 中的惰性只读属性

Swift 之惰性求值

为啥惰性变量/计算属性,而不仅仅是方法

Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter

使用惰性执行代码一次 - Swift