ARC __güvensiz_anlamı unretained?
Doğru anladığımdan emin olmak istiyorum:
- 0* *Benim değil nesneler gerek var mı?
- Bir nesne
__unsafe_unretained
@property
assign
kullanmak gerekir mi? Bu nesne korunmaz, ve sadece ben ata nesne anlamına gelir anlamına mı geliyor? - Ne zaman delege dışında kullanmak isteyeyim?
- ARK bir şey kullanın önce.
CEVAP
LLVM Derleyici 3.0 dört yeni mülkiyet elemeleri tanıttı: , *, *6__strong
__autoreleasing
, ve __weak
. İlk üç hatta ARC dışında mevcut the specification olarak başına.
Joshua gösterir gibi, varsayılan olarak tüm işaretçiler ARK altında __strong
ima edilmiş. Bu bir nesne işaretçisi atandığında, bu işaretçi anlamına gelir sürece korunur anlamına gelir. Bu birçok şey için iyi, ama benim cevap here tarif olarak korumak döngüleri için olasılığını açar. Örneğin, eğer bir nesne içeren bir nesne olarak bir örnek, değişken, ama bu ikinci nesne olan güçlü bir bağlantı ilk olarak temsilci, iki nesne asla yayımladı.
__unsafe_unretained
__weak
elemelerinde bulunduğunu, bu nedenle içindir. Bunların en yaygın kullanımı için delegeler, nereden aldın tanımlama özelliği için temsilci ile weak
unsafe_unretained
öznitelik (assign
etkili unsafe_unretained
), ve sonra eşleşen işaretleme ile ilgili örnek değişkeni ile __weak
__unsafe_unretained
. Bu temsilci örnek değişkeni hala ilk nesneyi işaret anlamına gelir, ama bu nesne, böylece döngü korur kırılma ve iki nesne serbest bırakılmasını sağlayan korunabilmesi için neden olmaz.
Delegeler ötesinde, bu kodda formu başka herhangi bir muhafaza döngüleri kırmak için yararlıdır. Yardımsever, Kaçakları cihaz şimdi grafiksel bir şekilde uygulamanızda saptadığı korumak devir gösteren Devir bir görünüm içerir.
__unsafe_unretained
__weak
hem biraz farklı şekillerde nesneler, ama tutma önlemek. __weak
bir nesneye işaretçi çok güvenli bir davranıştır işaret ettiği nesne, kaldırma nil
çevirecektir. Adı ayırmanın daha sonra __unsafe_unretained
bir nesnenin nerede olduğunu hafızasına işaret devam edecektir, anlaşılacağı gibi. Bu çöküyor ayırmanın nesne erişim nedeniyle yol açabilir.
Neden hiç __unsafe_unretained
o zaman kullanırsınız? Ne yazık ki, __weak
tek dağıtım hedef olarak iOS 5.0 ve Aslan için desteklenir. Eğer iOS 4.0 ve Snow Leopard için geri hedeflemek istiyorsanız, __unsafe_unretained
niteleyici kullanmak, ya da Mike Ash MAZeroingWeakRef gibi bir şey kullanmak zorunda.