SORU
3 HAZİRAN 2014, Salı


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
24 EYLÜL 2014, ÇARŞAMBA


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.

Apple docs:

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BigBoyTV

    BigBoyTV

    25 EYLÜL 2013
  • gsipek

    gsipek

    20 Temmuz 2007
  • Utah Valley Online

    Utah Valley

    9 AĞUSTOS 2010