ARC声明属性属性 - 理解

时间:2012-10-31 17:17:34

标签: objective-c properties uml automatic-ref-counting

是否正确,strong属性引用了对象组合,weak属性引用了对象聚合,UML notation

2 个答案:

答案 0 :(得分:1)

有趣的问题。

我会说他们相似但不同。

在Objective-C中,弱引用的存在理由通常被描述为手动打破本来是保留周期的一种方式 - 这是必需的,因为ARC没有(至少目前)支持收集这样的周期。这实际上并不是聚合的用途。

您还会看到它们用于通知,其中一个对象将向另一个对象发送通知,只要后者存在即可。这可能被视为更接近聚合,但实际上是“如果目标存在则做某事”而不是“如果我死了就不杀死目标”。

您当然可以使用Obj-C中的弱引用来实现聚合,但您可能无法获得预期的行为。

考虑参考文献中的C ++示例:

class Professor;

class Department
{
   ...
private:
   // Aggregation
   Professor* members[5];
   ...
};

在Objective-C中可能是:

@interface Department

@property (weak) NSArray *members;
...

@end

当C ++对象被破坏时,数组也会被破坏,但数组的元素却不会被破坏。但是在Objective-C中,数组也没有被销毁 - NSArray始终保持对其成员的强引用,因此它们保持不变。您当然可以为Objective-C设计弱集合。

答案 1 :(得分:1)

我认为它与组合和聚合之间的差异没有任何关系,因为它们都用于两种情况。

您的链接中的示例:

  • 如果是一对一:
    1. Car strong提到了Carburetor。
    2. 化油器weak引用了Car。
  • 如果是一对多:
    1. Pond strong引用了一系列Ducks。
    2. 该数组保存strong对每个包含Duck的引用。
    3. Duck weak提到了池塘。

在这两种情况下,都有strong引用的所有者和拥有weak反向引用的对象。

所以我想说strongweak是表示组合或聚合的UML连接线的两个端点。