这两个定义不完全相同。
绝对不。您指出的两个定义的主要区别是“只要有人”。重要的是“其他人”。
考虑以下:
__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>都没有被其他地方的强引用/其他“持有”方式指出。