我们在这里增加引用计数吗?

Are we increasing the reference count here?

我看了好几个问题,但还是一头雾水。我读到这个: Objective-C ARC: strong vs retain and weak vs assign 和其他一些问题

当我们说:someObject.color = customColor

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

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

请注意,在一些不可变的 classes 上,-copy 方法只实现到 return self,因此它就像一个保留——它并不总是一个不同的对象参考。

official documentation 所述:

There are three kinds of retainable object pointer types:

  • block pointers (formed by applying the caret (^) declarator sigil to a function type)
  • Objective-C object pointers (id, Class, NSFoo*, etc.)
  • typedefs marked with attribute((NSObject))

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

  UIColor *color1 = [UIColor whiteColor];

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

在赋值过程中,对象没有被复制,但它们的引用被复制(引用计数增加)。

关于你的情况,如其他评论所述,它取决于 属性 属性:copy 属性创建对象的全新实例并增加其引用计数,留下原始对象不受影响。

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

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

的新对象