仪器引用计数
Reference Counting with Instruments
我将下面的代码放在 applicationDidFinishLaunching:
中,并通过 Instruments 结合 Allocations 工具启动应用程序.
func applicationDidFinishLaunching(aNotification: NSNotification) {
var a = Apartment()
var b = a
var c = a
var d = a
}
Apple 在 Swift 中关于内存管理的文档包括以下行:
Whenever you assign a class instance to a property, constant, or variable, that property, constant, or variable makes a strong reference to the instance...
我的印象是,对对象的强引用会使该对象的引用计数增加 1。通过让四个变量存储对同一个 Apartment
对象的引用,我进一步假设在某个时候 Instruments 会显示该对象的引用计数为 4。但它从来没有。相反,引用计数的峰值为 1 - 就好像 b
、c
和 d
存储的引用没有被计算在内。这是为什么?
Clang 编译器非常聪明地删除了不必要的 retain/release
电话。在这种情况下,变量 b, c, d
具有相同的生命周期
a
,因此不需要额外增加引用计数。
如果您制作 a, b, c, d
(可选)属性:
var a, b, c, d : Apartment?
您的 class 并将代码更改为
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
a = Apartment()
b = a
c = a
d = a
return true
}
然后您将在 Instruments 中观察到多个 retain/release 调用,
最终计数为 4。
这再次表明,永远不能依赖拥有的保留计数
任何特定值。
我将下面的代码放在 applicationDidFinishLaunching:
中,并通过 Instruments 结合 Allocations 工具启动应用程序.
func applicationDidFinishLaunching(aNotification: NSNotification) {
var a = Apartment()
var b = a
var c = a
var d = a
}
Apple 在 Swift 中关于内存管理的文档包括以下行:
Whenever you assign a class instance to a property, constant, or variable, that property, constant, or variable makes a strong reference to the instance...
我的印象是,对对象的强引用会使该对象的引用计数增加 1。通过让四个变量存储对同一个 Apartment
对象的引用,我进一步假设在某个时候 Instruments 会显示该对象的引用计数为 4。但它从来没有。相反,引用计数的峰值为 1 - 就好像 b
、c
和 d
存储的引用没有被计算在内。这是为什么?
Clang 编译器非常聪明地删除了不必要的 retain/release
电话。在这种情况下,变量 b, c, d
具有相同的生命周期
a
,因此不需要额外增加引用计数。
如果您制作 a, b, c, d
(可选)属性:
var a, b, c, d : Apartment?
您的 class 并将代码更改为
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
a = Apartment()
b = a
c = a
d = a
return true
}
然后您将在 Instruments 中观察到多个 retain/release 调用, 最终计数为 4。
这再次表明,永远不能依赖拥有的保留计数 任何特定值。