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
à nil
aimer 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"
strongObject
ne 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"
weakObject
pointe 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 weakObject
sera automatiquement défini sur nil
.
Maintenant, considérez ce qui se passe si nous nous mettons weakObject
à nil
aimer 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"
strongObject
pointe vers <some_object>
. Nous devons donc le garder.
Faible: "gardez ceci aussi longtemps que quelqu'un d'autre l'indique fortement"
weakObject
ne pointe pas <some_object>
.
Le résultat est que ce <some_object>
n'est pas désalloué, mais ce weakObject
sera le nil
pointeur.
[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"]