【问题标题】:Are we increasing the reference count here?我们在这里增加引用计数吗?
【发布时间】:2016-07-30 05:13:10
【问题描述】:

我已经阅读了几个问题,但我仍然感到困惑。我读到这个: Objective-C ARC: strong vs retain and weak vs assign 和其他一些问题

当我们说:someObject.color = customColor

我们是通过retaining 增加customColor 的引用计数,还是通过copying 创建一个新对象?还是没有?

【问题讨论】:

    标签: objective-c properties retain retaincount


    【解决方案1】:

    该语句正在分配给一个属性,即在 someObject 的类上调用一个 setter 方法。因此,这将取决于该方法的实现方式。如果这是基于属性的自动生成的 setter 方法,则: 如果是 copy 属性,将在 customColor 上调用 -copy 方法;如果strong,那么它将被保留(即增加引用计数),或者如果weakassign 则不会增加引用计数。

    请注意,在某些不可变的类中,-copy 方法被实现为只返回 self,因此这就像一个保留 - 它并不总是一个不同的对象引用。

    【讨论】:

    • 谢谢,所以如果是复制属性,不会增加customColor的引用计数,但是会增加新复制的对象的引用计数?
    • 您可以通过查看对象的地址轻松检查自己。对于不可变对象,这实际上是您不应该关心的实现细节——因为它可能以任何一种方式工作,或者现在或以后发生变化。你的合同只是说“给我一些表现得像副本的东西”。
    • @asma22 -- 这取决于 -copy 方法在接收器上的实现方式。对于像 NSNumber 这样的不可变对象,它实际上只会增加保留计数。但是对于像 NSMutableArray 这样的东西,是的,一个新的(不可变的)NSArray 实例将被创建和存储。我相信 UIColor 是那些不可变的类之一——所以在这种特殊情况下,它只会增加保留计数。从概念上讲,它是另一个对象,但不可变类可以优化该操作,因为无法修改实例。
    【解决方案2】:

    正如official documentation 所说:

    可保留对象指针类型共有三种:

    • 块指针(通过将插入符号 (^) 声明符符号应用于函数类型而形成)
    • Objective-C 对象指针(id、Class、NSFoo* 等)
    • 属性((NSObject))标记的typedefs

    当我们处理 Objective-C 对象指针时(位模式指示指向对象的位置),代码如下:

      UIColor *color1 = [UIColor whiteColor];
    
      // Increase reference count of color1 by 1, without copying it.
      UIColor *color2 = color1;
    

    在分配期间,对象不会被复制,但它们的引用是(随着引用计数的增加)。

    关于您的情况,正如另一条评论中所述,它取决于属性属性:copy 属性创建对象的全新实例并增加其引用计数,而原始对象不受影响。

    顺便说一句,您可以使用分配工具验证对象的引用计数。例如,查看这个不错的 answer 以了解如何管理它。

    【讨论】:

      【解决方案3】:

      我从 Apple 自己的documentation 中找到了这张图片,如果 color 属性是一个强指针,那么它会增加保留计数,如果它是一个复制指针,那么它将创建一个保留计数为 1 的新对象

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-11
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 2019-09-05
        相关资源
        最近更新 更多