我将以下代码放在applicationDidFinishLaunching:
中,并通过 Instruments 与 Allocations 工具一起启动应用。
func applicationDidFinishLaunching(aNotification: NSNotification) {
var a = Apartment()
var b = a
var c = a
var d = a
}
Apple关于Swift中内存管理的文档包括以下行:
无论何时将类实例分配给属性,常量或变量,该属性,常量或变量都会对实例进行强引用...
我的印象是,对象的强引用会使该对象的引用数量增加一个。通过使用四个变量存储对同一Apartment
对象的引用,我进一步假设在某些时候 Instruments 将显示该对象的引用计数为4。但它永远不会。相反,引用计数达到峰值 - 好像b
,c
和d
存储的引用都没有被计算在内。这是为什么?
答案 0 :(得分:1)
Clang编译器非常聪明地删除不必要的保留/释放
调用。在这种情况下,变量b, c, d
具有相同的生命周期
因为a
,因此不需要额外增加引用计数。
如果你制作a, b, c, d
(可选)属性:
var a, b, c, d : Apartment?
你班级的并将代码更改为
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
a = Apartment()
b = a
c = a
d = a
return true
}
然后你会在Instruments中观察到多个保留/释放调用, 最终数为4。
这再次表明人们永远不能依赖保留计数 任何特定的价值。