Cocoa 使用仪器进行参考计数

Cocoa 使用仪器进行参考计数,cocoa,swift,memory-management,automatic-ref-counting,instruments,Cocoa,Swift,Memory Management,Automatic Ref Counting,Instruments,我将下面的代码放入ApplicationIDFinishLaunching:,并通过仪器与分配工具一起启动了应用程序 苹果在Swift中关于内存管理的文档包括以下内容: 无论何时将类实例指定给属性、常量或变量,该属性、常量或变量都会对实例进行强引用 我的印象是,对某个对象的强引用会使该对象的引用计数增加1。通过使用四个变量存储对同一单元对象的引用,我进一步假设,在某些情况下,仪器将显示该对象的引用计数为四。但从来没有。相反,引用计数在1处达到峰值-就好像由b、c和d存储的引用没有被计数一样。这是

我将下面的代码放入
ApplicationIDFinishLaunching:
,并通过仪器与分配工具一起启动了应用程序

苹果在Swift中关于内存管理的文档包括以下内容:

无论何时将类实例指定给属性、常量或变量,该属性、常量或变量都会对实例进行强引用


我的印象是,对某个对象的强引用会使该对象的引用计数增加1。通过使用四个变量存储对同一
单元
对象的引用,我进一步假设,在某些情况下,仪器将显示该对象的引用计数为四。但从来没有。相反,引用计数在1处达到峰值-就好像由
b
c
d
存储的引用没有被计数一样。这是为什么?

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

这再次表明,一个人永远不能依赖保留计数
任何特定的值。

您必须查看生成的代码,但任何合适的编译器都会删除所有最终未使用的变量。您是否激活了Instruments中的“Record Reference Counts”(记录引用计数)选项?是的,我确保了“Record Reference Counts”(记录引用计数)我想我在某个地方遇到过一篇帖子,上面说工具报告的留存数量只会比预期的要大——这显然是误导。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    a = Apartment()
    b = a
    c = a
    d = a
    return true
}