就UML表示法strong
而言,属性指的是对象组合,而weak
属性指的是对象聚合,这是否正确?
问问题
135 次
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
我认为这与组合和聚合之间的区别没有任何关系,因为它们都在两种情况下都使用。
您的链接中的示例:
- 一对一的情况下:
- 汽车有
strong
参考化油器。 - 化油器
weak
参考了汽车。
- 汽车有
- 在一对多的情况下:
- Pond
strong
引用了一组 Ducks。 - 该数组包含
strong
对每个包含的 Duck 的引用。 - 鸭子有
weak
池塘的参考。
- Pond
在这两种情况下,都存在具有引用的所有者和具有反向引用的strong
拥有对象。weak
所以我会说strong
和weak
是表示组合或聚合的 UML 连接线的两个端点。
于 2013-01-26T23:01:20.413 回答