Zayıf bir referans ve sahipsiz bir başvuru arasındaki fark nedir?
Swift:
- Güçlü Referanslar
- Zayıf Başvuruyor
- Sahipsiz Başvuruyor
Ne kadar sahipsiz bir referans zayıf bir referans farklıdır?
Ne zaman sahipsiz bir referans olarak kullanmak için güvenli mi?
Sahipsiz referanslar dangling pointers C/C gibi bir güvenlik riski vardır ?
CEVAP
weak
unowned
başvurular hem başvurulan nesne üzerinde strong
bir tutmak oluşturmak etmeyin.k.bir. söz konusu nesne ayırmayı kaldırma ARK önlemek için koru sayısı) artış yok.
Ama neden iki anahtar? Bu ayrım Optional
türleri yerleşik Swift dili olduğu gerçeği ile ilgisi var. Uzun hikaye onlar hakkında kısa: optional types bellek güvenlik (bu yarar sağlamak için güzel katı olan Swift's constructor rules ile çalışır) sunuyoruz.
weak
referans verir olasılık bunu olmak nil
(Bu otomatik olarak gerçekleşir zaman başvurulan bir nesne kaldırıldı), bu nedenle bu tür özellik olmalı isteğe bağlı - yani, bir programcı, mecbur onay daha önce kullandığınız (temel olarak derleyici güçleri kadar, yazmak güvenli kod).
unowned
bir referans asla ömrü boyunca nil
olacak varsayar. Sahipsiz bir referans başlatma sırasında ayarlanmış olması gerekir - bu referans kontrolü olmadan güvenle kullanılabilecek isteğe bağlı olmayan bir tür olarak tanımlanmış olması anlamına gelir. Eğer bir şekilde nesne başvurulan ayırmanın, o zaman app sahipsiz başvuru kullanılacak kilitlenmesine.
Referans olmak için geçerli olan her zaman zayıf bir referans kullanın onun ömrü boyunca bir noktada yoktur. Tersine, bir sahipsiz kullanın başvuru bu arada nil olacağını biliyorsun ne zaman başvuru ayarlanmış başlatma sırasında.
Docs döngüleri korumak ve onları kırmak için nasıl anlatılır bazı örnekler var. Tüm bu örnekler the docs elde edilir.
weak
örneğin anahtar kelime:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
weak var tenant: Person?
}
Ve şimdi, bazı ASCII art (see the docs - güzel şemalar var gitmelisin):
Person ==(strong)==> Apartment
Person <==(weak)==== Apartment
Person
Apartment
örnek nil izin iki özellikleri, güçlü bir referans döngüsü neden olma potansiyeline sahip bir durum gösterir. Bu senaryonun en zayıf başvurusu ile çözüldü. Her iki tarafın da diğerinin üzerine katı bir bağımlılık olmadan var olamaz.
unowned
örneğin anahtar kelime:
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}
Bu örnekte, Customer
bir Mayıs veya ** 20, ama CreditCard
bir olmayabilirolacak her zamanCustomer
ile ilişkili olabilir. Bu göstermek için, Customer
sınıfı card
isteğe bağlı bir özelliği vardır, ama CreditCard
sınıfı isteğe bağlı olmayan (sahipsiz) customer
bir özelliği vardır.
Customer ==(strong)==> CreditCard
Customer <=(unowned)== CreditCard
Customer
CreditCard
örnek nil olmasına izin verilen bir özellik ve nil edilemeyen başka bir özelliği güçlü bir referans döngüsü neden olma potansiyeline sahip bir durum gösterir. Bu Senaryo, En İyi sahipsiz bir başvuru ile çözüldü.
Apple'dan not:
Zayıf başvuru değişkenler olarak, onların işaret bildirilmelidir değeri çalışma zamanında değiştirebilirsiniz. Zayıf bir referans olamaz bildirilmesi sürekli.
Ayrıca her iki özelliği her zaman bir değer olması gerekirken üçüncü bir senaryo var, ne de mülk hiç başlatma tamamlandıktan sonra sıfır olmalıdır.
Ve aynı zamanda klasik korumak döngüsü senaryoları kapanışları ile çalışırken önlemek için vardır.
Bunun için, ** 36 veya okumak the book ziyaret etmenizi öneririz.
Yumuşak bir referans ve Java zayıf bir...
Web referans ve hizmet başvuru arasınd...
__Zayıf __engellemek başvuru arasındak...
Bir C arasındaki fark nedir# Referans ...
Java: güçlü/yumuşak/zayıf/hayalet refe...