【问题标题】:Swift lazy variable and didReceiveMemoryWarningSwift 惰性变量和 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 中实现这一点?

谢谢

【问题讨论】:

    标签: swift nsfetchedresultscontroller lazy-initialization


    【解决方案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”是一个不错的补充。
    猜你喜欢
    • 2015-01-19
    • 2013-07-12
    • 2018-06-11
    • 2014-09-22
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多