2012-10-31 50 views

回答

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

将数组属性声明为'weak'不是个好主意。一旦你在那里分配了一个'NSArray'实例,并且你没有把它存储在其他地方,你就会失去它,并且可能会丢失所有包含的对象。 – Tricertops

+0

此外,基金会也有弱收藏。 'NSHashTable'和'NSMapTable'是'NSMutableSet'和'NSMutableDictionary'的弱等价物。但是你仍然需要“强烈的”引用来让它们活着。 – Tricertops

+0

有很好的理由使用'weak' ..但是所有由'weak'属性槽引用的对象都必须在程序的其他地方有一个'strong'引用。 – nielsbot

1

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

例子:

  • 在一到一个案例:
    1. 车有strong参考化油器。
    2. 化油器有weak参考汽车。
  • 在一个对多的情况下:
    1. 池具有strong参照鸭子的阵列。
    2. 该数组包含strong对每个包含的Duck的引用。
    3. 鸭子有weak参考池塘。

在这两种情况下,有业主与strong参考,并weak反向引用拥有的对象。

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