【发布时间】:2010-09-20 19:24:51
【问题描述】:
我非常熟悉想要复制属性与保留的原因。 (本质上是值与关系的论点。例如,您几乎总是想复制字符串。)
NSColor 和 NSGradient 呢?
它们都符合 NSCopying,但就目前的实现而言,它们是不可变的。
想法?
【问题讨论】:
我非常熟悉想要复制属性与保留的原因。 (本质上是值与关系的论点。例如,您几乎总是想复制字符串。)
NSColor 和 NSGradient 呢?
它们都符合 NSCopying,但就目前的实现而言,它们是不可变的。
想法?
【问题讨论】:
不可变对象通常将它们的copyWithZone: 方法实现为return [self retain],因为如果数据永远不会改变,那么制作单独的数据副本是没有意义的。不过,他们仍然需要实现该方法,以与任何期望 NSCopying 一致性的东西(例如 NSDictionary 键)兼容。
至于使用,我会坚持使用与其他“值”属性相同的使用模式,并且您不会看到任何性能差异,因为它们很可能会从copy 调用retain。这也适用于添加具有非平凡的 NSCopying 实现的可变子类等情况。
【讨论】:
copy 而不是retain,因为它避免了一些其他对象在意外情况下改变值的可能性。在多线程的上下文中更是如此,为了线程安全,应该鼓励使用不可变对象(这里考虑 erlang)。这条规则最值得注意的例外是当我需要保留参考以进行绑定或观察时。
分配给您的属性的 NSColor 和 NSGradient 的子类可能不是不可变的或引用透明的,因此您仍应使用与任何具有常用可变子类的对象相同的逻辑来确定保留与复制,即使在实践中,大多数时候它不太重要。
【讨论】: