2つの定義は同じではありません。
絶対違う。あなたが指摘した2つの定義の主な違いは、「他の誰かと同じくらい」です。重要なのは「他の誰か」です。
以下を検討してください。
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
これで、への2つのポインタが得られました。1 <some_object>
つは強い、もう1つは弱いです。そのように設定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>
、別の場所の別の強力な参照/「保持」される他の手段によって指されていないことに注意してください]