这两个定义不完全相同。
绝对不。您指出的两个定义的主要区别是“只要有人”。重要的是“其他人”。
考虑以下:
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
现在我们有两个指向的指针<some_object>
,一个是强项,另一个是弱项。如果我们设置strongObject
到nil
像现在这样:
strongObject = nil;
然后,如果您遵循列出的规则,则会问自己以下问题:
强:“将其保留在堆中,直到我不再指向它为止”
strongObject
不再指向<some_object>
。因此,我们不需要保留它。
弱:“只要有人坚决指出,就保持下去”
weakObject
仍然指向<some_object>
。但是由于没有人指出它,因此该规则也意味着我们不需要保留它。
结果是<some_object>
已解除分配,并且如果您的运行时支持它(Lion和iOS 5及更高版本),weakObject
则将自动设置为nil
。
现在考虑如果我们设置发生了什么weakObject
来nil
,像这样:
weakObject = nil;
然后,如果您遵循列出的规则,则会问自己以下问题:
强:“将其保留在堆中,直到我不再指向它为止”
strongObject
确实指向<some_object>
。所以我们确实需要保留它。
弱:“只要有人坚决指出,就保持下去”
weakObject
没有指向<some_object>
。
其结果是,<some_object>
在不释放,但weakObject
将是nil
指针。
[请注意,所有假定的内容<some_object>
都没有被其他地方的强引用/其他“持有”方式指出。