Swift 中昂贵的对象管理

Posted

技术标签:

【中文标题】Swift 中昂贵的对象管理【英文标题】:Expensive Object management in Swift 【发布时间】:2014-06-04 16:25:30 【问题描述】:

过去几天我一直在看 Swift,它看起来不错,但即使在查看了 Apple 发布的指南之后,我仍然感到困惑。

我知道 Swift 中的内存管理使用 ARC,因此非常安全,但是在我想要更精细地控制对象创建和销毁的情况下,我有点困惑。

举两个简单的例子:

在 ObjC 中,当您(例如)喜欢一个 UIViewController 并打算在您的应用程序的整个生命周期内一直存在并且只创建一次(比如说因为它的创建成本很高)时,您可以将其设为属性,然后像这样包装它的 Alloc Init:

if (!self.myProperty)

    self.myProperty = [[MyObj alloc] init];

这样它只创建一次,保持状态,并且同一个对象实例可以无限期地重复使用,产生已知的对象引用,并且每次 viewController 超出范围时都不必重新创建良好的性能。

另一个例子是 NSMutableString 与 Swifts String。

您可以多次设置 NSMutableString 的字符串,并且它会保持相同的对象引用,但是在更改 Swift 字符串时似乎并非如此。

这可能只是“Objective C 中不推荐使用的想法”,但在某些对象的使用生命周期内,是否存在关于保留昂贵对象或保持状态(相同对象)的最佳实践。

【问题讨论】:

【参考方案1】:

我认为您正在寻找的是“惰性存储属性”:

example in the swift docs 是:

class DataManager 
    @lazy var importer = DataImporter()
    var data = String[]()
    // the DataManager class would provide data management functionality here

它说的是@lazy

惰性存储属性是在第一次使用时才计算初始值的属性。您可以通过在声明之前编写 @lazy 属性来指示惰性存储属性。

关于NSMutableString 的评论有点不同,你可以继续在你的swift代码中使用NSMutableString,但是Apple鼓励开发者尽可能使用Swift内置类型:)

请参阅swift docs 中的“字符串可变性”部分

【讨论】:

以上是关于Swift 中昂贵的对象管理的主要内容,如果未能解决你的问题,请参考以下文章

Swift2.0(17)内存管理ARC

swift内存管理中的引用计数

Swift 内存管理:在 var 中存储 func

Swift 内存管理与循环引用问题(weakunowned)

Swift 中的 iOS 私有/公共数据管理和存储

Swift之深入解析Core Data数据管理的集成指南