ARC中的引用计数

时间:2016-11-25 06:48:39

标签: ios objective-c swift automatic-ref-counting

我在if (navigationController.viewControllers.count > 0) { //Cast UIViewController with your custom Controller ViewController *vc = (ViewController*) [navigationController.viewControllers firstObject]; //Now pass data you want vc.passData = ... } 引用计数中有点混乱你可以告诉我下面的代号是什么引用计数。

ARC

问题是:

  • vc1的引用计数?
  • vc2的引用计数?
  • vc3的引用计数?
  • vc4的引用计数?

4 个答案:

答案 0 :(得分:17)

此处,vc1vc2vc3指的是同一个对象。因此,该对象的引用计数为3.当vc4引用同一个对象时,由于它是弱引用,引用计数不会增加1.因此,此后的引用计数也将为3

  1. 第一行代码后UIViewController创建和引用的vc1对象的引用计数为1.

    var vc1:UIViewController? = UIViewController() // strong reference 
    
  2. vc2引用与vc1相同的对象后。对象的引用计数变为2

    var vc2:UIViewController? = vc1 // strong reference
    
  3. vc3引用与vc1vc2相同的对象后。对象的引用计数变为3

    var vc3:UIViewController? = vc2 // strong reference
    
  4. vc4引用与vc1vc2vc3相同的对象后。由于vc4是弱引用,因此引用计数不会递增。这意味着计数仍然是3。<​​/ p>

    weak var vc4:UIViewController? = vc3 // weak reference
    
  5. 含义:

    执行以下代码。

       vc1 = nil; // reference count = 3-1 = 2
       vc2 = nil; // reference count = 2-1 = 1
       vc3 = nil; // reference count = 1-1 = 0 and object is destroyed
    

    现在,打印vc4的值。它将是nil。发生这种情况是因为对象的引用计数变为零,并且所有变量都引用相同的对象。

    修改

    在下面的代码中使用CFGetRetainCount会得到以下结果:

    var vc1:NSDate? = NSDate()
    print(CFGetRetainCount(vc1)) // 2 - I expected this to be 1 as only one variable is strongly referring this object. 
    
    var vc2:NSDate? = vc1
    print(CFGetRetainCount(vc1)) // 3 - reference count incremented by 1 (strong reference)
    
    var vc3:NSDate? = vc2
    print(CFGetRetainCount(vc3)) // 4 - reference count incremented by 1 (strong reference)
    
    weak var vc4:NSDate? = vc1
    print(CFGetRetainCount(vc1)) // 4 - reference count not incremented (weak reference)
    
    vc1 = nil
    print(CFGetRetainCount(vc2)) // 3 - reference count decremented by 1 (strong reference removed)
    
    vc2 = nil
    print(CFGetRetainCount(vc3)) // 2 - reference count decremented by 1 (strong reference removed)
    
    vc3 = nil 
    print(vc4) // nil - reference count should be decremented by 1 (last strong reference removed)
    
    // Also due to the final line vc3 = nil, reference count should become zero
    // However, we can't use `CFGetRetainCount` to get reference count in this case
    // This is due to the final strong reference being removed and object getting destroyed
    

    CFRetainCount在第1行中给出2的原因已经讨论here。感谢@CodaFi和@Sahil在评论中的讨论

答案 1 :(得分:4)

您可以使用CFGetRetainCount功能进行支票参考计数。

var vc1 = UIViewController()
var vc2 = vc1
var vc3 = vc2
weak var vc4 = vc3


print(CFGetRetainCount(vc1)) //4
print(CFGetRetainCount(vc2)) //4 
print(CFGetRetainCount(vc3)) //4
print(CFGetRetainCount(vc4)) //4

您也可以参考此Get Ref Count

答案 2 :(得分:2)

在我看来,vc1到vc3会增加保留计数,而默认属性为strong ,直到我们将其指定为weak

strong: 强类通常由类用于建立对象的所有权。它增加了保留计数(ARC为你处理的事情),它基本上保留了内存中指向的对象,直到该类实例停止指向它。这通常是你想要的,但它可能导致一种叫做“保留周期”的东西。

如果您将vc4视为weak

弱: 这会提供指向对象的指针,但不会声明所有权,也不会增加保留计数。它基本上保持一个指向对象的有效指针,只要另一个类强烈指向它。如果没有别的东西试图保留它,弱指针会自动设置为nil。

答案 3 :(得分:1)

1,2,3,4 - 引用计数为3

引用计数不会增加的唯一例外 - 第4行,因为弱修饰符