1

就UML表示法strong而言,属性指的是对象组合,而weak属性指的是对象聚合,这是否正确?

4

2 回答 2

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 设计弱集合。

于 2012-10-31T18:01:53.457 回答
1

我认为这与组合和聚合之间的区别没有任何关系,因为它们都在两种情况下都使用。

您的链接中的示例:

  • 一对一的情况下:
    1. 汽车有strong参考化油器。
    2. 化油器weak参考了汽车。
  • 在一对多的情况下:
    1. Pondstrong引用了一组 Ducks。
    2. 该数组包含strong对每个包含的 Duck 的引用。
    3. 鸭子有weak池塘的参考。

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

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

于 2013-01-26T23:01:20.413 回答