2015-05-26 22 views
6

Şu anda Apple Documentation ürününü takip ediyorum. reference1 sonraARC (Otomatik Referans Sayma) İşlemi

class Person { 
    let name: String 
    init(name: String) { 
     self.name = name 
     println("\(name) is being initialized") 
    } 
    deinit { 
     println("\(name) is being deinitialized") 
    } 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var reference1: Person? 
     var reference2: Person? 
     var reference3: Person? 
     reference1 = Person(name: "John Appleseed") 
     // prints "John Appleseed is being initialized 
     reference2 = reference1 
     reference3 = reference1 

     reference1 = nil 
     reference2 = nil 
    } 
} 

nil eşittir ARC reference3 = nil sonra örneği ve baskılar "John Appleseed is being deinitialized"

olması gerekmiyor kaldırır kaldırır,: İşte benim soru nedir?

+0

@JakubVano i viewDidLoad Bu kodu() yöntemi çalıştırıyorum fazla bilgi almak için. Ancak, referans3 nil değildir, derleyici güçlü referansın varlığını bile geçersiz kılar. – ridvankucuk

+0

Bu ekran görüntüsü, netlik değil, karmaşa ekledi. – nhgrif

+0

"Sınırsızlık" ın gerçekleştiği * kesin * anı nasıl belirliyorsunuz? Yöntemin geri döndüğü anda çağrılmayı beklerim (ve kesinlikle bir süre sonra). Bir çeşit optimizasyon nedeniyle daha erken çağrılabilir, ancak yöntem geri döndükten sonra kesinlikle takılmayacaktır. – nhgrif

cevap

6

Buradaki sorun kapsamı meselesidir. Kesme noktaları ile daha fazlasını bulabiliriz.

Burada, reference1'u başlatmamızdan hemen önce durduk.
Tüm değişkenler expectedly nil şunlardır:

enter image description here

Ve reference1 başlatma sonra? enter image description here

Her üç değişkenli

aynı bellek konumuna işaret ve biz başlatıcı görebilirsiniz:

enter image description here


Tamam, reference2 ve reference3 ayarlandıktan sonra ileri atlayalım sadece bir kez koştu. Hepsi aynı yere işaret ediyor. ileri

edelim adım:

enter image description here

reference1 şimdi None işaret ediyor. nil. deinit mmethod çağrılmamış ve mesajını basmıştır. ileriye biraz daha

edelim adım:

enter image description here

Şimdi reference1 ve reference2 hem beklenildiği nil bulunmaktadır. Eklediğim println ifadeleri arandı. Ancak deinit çalışmaz ve reference3nil değildir.

Bir sonraki adım, yöntemin tüm çıkış yoluna giriyor.Biz yöntemin dışına gittiğinizde, değişkenler kapsamı dışındadır ve deinit denir:

enter image description here

1

Derleyici, yerel olarak oluşturulmuş bir nesnenin daha fazla kullanılmadığını algılayabildiğinden, ayrılır. Örneğin viewDidLoad metodu Person yönteminin çalıştırılmasından sonra aşağıdaki kod içinde serbest bırakılacaktır, çünkü gelecekte kişi nesnesini kullanacak kimse yoktur.

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib.\ 

     var reference1: Person? 
     var reference2: Person? 
     var reference3: Person? 
     reference1 = Person(name: "John Appleseed") 
     // prints "John Appleseed is being initialized 
     reference2 = reference1 
     reference3 = reference1 

     reference1 = nil 
     reference2 = nil 

//  println(reference3?.name) 
} 

nesneyi korumak istiyorsanız

o zaman reference3 aşağıda property olarak oluşturmanız gerekir:

class ViewController: UIViewController { 

    var reference3 : Person? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var reference1: Person? 
     var reference2: Person? 

     reference1 = Person(name: "John Appleseed") 
     // prints "John Appleseed is being initialized 
     reference2 = reference1 
     reference3 = reference1 

     reference1 = nil 
     reference2 = nil 

//  println(reference3?.name) 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     println(reference3?.name) 
    } 

} 
+0

** reference3? .name ** adresine ** referans3 ** global değilse bile erişebilirim. – ridvankucuk

+0

didLoad içinde reference3 bildiriyor ve didAppear'da kullanmıyorsanız hiçbir uygulama derlenmeyecektir. – kmithi