Hem weak
ve unowned
referanslar bir oluşturmayın strong
(bunlar sevk nesne ayırmayı kaldırma engelle ARC amacıyla sayımı korumak artmadığını aka) sevk nesne üzerinde tutun.
Peki neden iki anahtar kelime? Bu ayrım, Optional
türlerin Swift dilinde yerleşik olması gerçeğiyle ilgilidir . Uzun hikaye kısa: isteğe bağlı türler bellek güvenliği sunar (bu, Swift'in yapıcı kurallarıyla güzel çalışır - bu fayda sağlamak için katıdır).
Bir weak
başvuru, nil
(başvurulan nesne yeniden konumlandırıldığında bu otomatik olarak gerçekleşir) olasılığına izin verir , bu nedenle mülkünüzün türü isteğe bağlı olmalıdır - bu nedenle, bir programcı olarak, onu kullanmadan önce kontrol etmeniz gerekir (temelde derleyici sizi olabildiğince güvenli kod yazmaya zorlar).
Bir unowned
referans nil
, ömrü boyunca asla olmayacağını varsayar . Başlatma sırasında bilinmeyen bir referans ayarlanmalıdır - bu, referansın kontroller olmadan güvenle kullanılabilecek isteğe bağlı olmayan bir tür olarak tanımlanacağı anlamına gelir. Bir şekilde atıfta bulunulan nesne yeniden konumlandırılırsa, sahipsiz referans kullanıldığında uygulama kilitlenir.
Gönderen Elma docs :
Bu başvurunun kullanım ömrü boyunca bir noktada sıfır olması geçerli olduğunda zayıf bir başvuru kullanın. Bunun tersine, başvurunun başlatma sırasında ayarlandıktan sonra hiçbir zaman sıfır olmayacağını bildiğinizde bilinmeyen bir referans kullanın.
Dokümanlarda, tutma döngülerini ve bunların nasıl kırılacağını tartışan bazı örnekler vardır. Tüm bu örnekler dokümanlardan çıkarılmıştır .
weak
Anahtar kelime örneği :
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 sanatı için (gitmeli belgeleri görmelisiniz - güzel diyagramları var):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
Person
Ve Apartment
örneğin Şekil sıfır olarak izin verilen, her ikisi de, iki özellik, güçlü bir referans döngüsü neden olma potansiyeline sahip bir durumdur. Bu senaryo en iyi şekilde zayıf bir referansla çözülür. Her iki varlık da diğerine sıkı bir bağımlılık göstermeden var olabilir.
unowned
Anahtar kelime örneği :
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, a bir Customer
olabilir veya olmayabilir CreditCard
, ancak a CreditCard
her zaman a ile ilişkilendirilir Customer
. Bunu temsil etmek için, Customer
sınıfın isteğe bağlı bir card
özelliği vardır, ancak CreditCard
sınıfın isteğe bağlı olmayan (ve sahipsiz) bir customer
özelliği vardır.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Customer
Ve CreditCard
örneğin Şekil, bir sıfır olarak bırakılır özelliği ve sıfır olamaz başka bir özelliği, bir güçlü bir referans döngüsü neden olma potansiyeline sahip olan bir durum. Bu senaryo, en iyi şekilde bilinmeyen bir referansla çözülür.
Apple'dan not:
Zayıf referanslar, değerlerinin çalışma zamanında değişebileceğini belirtmek için değişken olarak bildirilmelidir. Zayıf bir referans sabit olarak ilan edilemez.
Her iki özelliğin de her zaman bir değere sahip olması ve başlatma tamamlandıktan sonra hiçbir özelliğin sıfır olmaması gereken üçüncü bir senaryo da vardır.
Ayrıca, kapaklarla çalışırken kaçınılması gereken klasik tutma döngüsü senaryoları da vardır.
Bunun için Apple belgelerini ziyaret etmenizi veya kitabı okumanızı tavsiye ederim .