Les deux définitions ne sont-elles pas identiques.
Absolument pas. La principale différence entre les deux définitions que vous avez signalées est le «tant que quelqu'un d'autre». C'est le «quelqu'un d'autre» qui est important.
Considérer ce qui suit:
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
Maintenant, nous avons deux pointeurs vers <some_object>, un fort et un faible. Si nous nous mettons strongObjectà nilaimer ainsi:
strongObject = nil;
Ensuite, si vous suivez les règles que vous avez décrites, vous vous poserez les questions suivantes:
Strong: "gardez ceci dans le tas jusqu'à ce que je ne le pointe plus"
strongObjectne pointe <some_object>plus. Nous n'avons donc pas besoin de le garder.
Faible: "gardez ceci aussi longtemps que quelqu'un d'autre l'indique fortement"
weakObjectpointe toujours vers <some_object>. Mais puisque personne d' autre ne l' indique, cette règle signifie également que nous n'avons pas besoin de la garder.
Le résultat est qu'il <some_object>est désalloué et si votre environnement d'exécution le prend en charge (Lion et iOS 5 à partir de), il weakObjectsera automatiquement défini sur nil.
Maintenant, considérez ce qui se passe si nous nous mettons weakObjectà nilaimer ainsi:
weakObject = nil;
Ensuite, si vous suivez les règles que vous avez décrites, vous vous poserez les questions suivantes:
Strong: "gardez ceci dans le tas jusqu'à ce que je ne le pointe plus"
strongObjectpointe vers <some_object>. Nous devons donc le garder.
Faible: "gardez ceci aussi longtemps que quelqu'un d'autre l'indique fortement"
weakObjectne pointe pas <some_object>.
Le résultat est que ce <some_object>n'est pas désalloué, mais ce weakObjectsera le nilpointeur.
[Notez que tout ce qui est supposé <some_object>n'est pas indiqué par une autre référence forte ailleurs / par d'autres moyens d'être "détenu"]