İki tanım aynı değil mi?
Kesinlikle hayır. Belirttiğiniz iki tanımdaki temel fark, "başkası olduğu sürece" dir. Önemli olan "başka biri" dir.
Aşağıdakileri göz önünde bulundur:
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
Şimdi iki işaretimiz var <some_object>
, biri güçlü, diğeri zayıf. Biz ayarlarsanız strongObject
için nil
öylesine gibi:
strongObject = nil;
Ardından, özetlediğiniz kuralları uygularsanız, kendinize şu soruları soracaksınız:
Güçlü: "artık işaret etmeyene kadar bunu yığında tut"
strongObject
artık işaret etmiyor <some_object>
. Yani onu tutmamıza gerek yok.
Zayıf: "Başkası güçlü bir şekilde işaret ettiği sürece bunu saklayın"
weakObject
hala işaret ediyor <some_object>
. Ama kimse bu yana başka buna noktaları, bu kural da bunu tutmak gerek olmadığı anlamına gelir.
Sonuç, <some_object>
atamanın kaldırılması ve çalışma zamanınız destekliyorsa (Lion ve iOS 5 üstü) weakObject
otomatik olarak şu şekilde ayarlanacaktır:nil
.
Şimdi set ne olur düşünün weakObject
için nil
öylesine gibi:
weakObject = nil;
Ardından, özetlediğiniz kuralları uygularsanız, kendinize şu soruları soracaksınız:
Güçlü: "artık işaret etmeyene kadar bunu yığında tut"
strongObject
işaret ediyor <some_object>
. Yani onu korumamız gerekiyor.
Zayıf: "Başkası güçlü bir şekilde işaret ettiği sürece bunu saklayın"
weakObject
işaret etmiyor <some_object>
.
Sonuç olmasıdır <some_object>
edilir değil ayırmanın, ancak weakObject
olacak nil
işaretçi.
[Tüm varsayımların <some_object>
, başka bir yerde başka bir güçlü referansla / "tutulmanın" başka yollarıyla gösterilmediğine dikkat edin]