Swift惰性变量和didReceiveMemoryWarning

4

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

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

我知道这只会被调用一次。
所以,如果我遇到了didReceiveMemoryWarning,测试似乎表明将其设置为nil没有任何效果,因为它不会在以后访问时重新初始化,就像Objective C属性一样。
更大的问题是NSFetchedResultControllers,因为我可能真的想卸载大量数据,然后在以后重新加载。
在Swift中如何实现这一点?
谢谢
1个回答

4
作为解决方案,您可以使用一个最初为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,无论您想设置多少次,都可以确保下一次以读模式访问它时会再次初始化。

请注意,此实现不是线程安全的,但很可能仅从主线程使用。


2
谢谢。很有道理。这让我觉得比仅使用“lazy”更强大。所以我想知道为什么还要费心去使用“lazy”? - Fittoburst
1
懒加载的使用场景通常是当属性只需要初始化一次,并且与类实例的生命周期相同。它在许多情况下都很有用,只是不适用于你的情况 :) - Antonio
我同意@Fittoburst的看法,当“nil”时使用lazy会是一个不错的补充。 - zirinisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接