2016-01-21 11 views
30

handlerUIAlertAction'un kapağını yazarken, self numaralı başvuru kaynağının güçlü olması (varsayılan), weak veya unowned?Kendini bir UIAlertAction işleyicisinde güçlü olarak yakalanmalı mı?

Orada bu konu (1, 2, 3, 4) ilgili mesajlar olmuştur ama bu durumda nasıl yardımcı dürüst görmüyorum. Bu tipik kodu

edelim odağı:

func tappedQuitButton() { 
    let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet) 

    let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    alert.addAction(quitAction) 

    let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    alert.addAction(cancelAction) 

    presentViewController(alert, animated: true, completion: nil) 
} 

Bu yüzden self uyarısı sunan görünümü denetleyicisi olan bir UIViewController alt sınıf içinde bir fonksiyondur.

documentation diyor ki: O referans ömrünün bir noktasında “hiçbir değeri” olması için

mümkün olduğunda başvuru çevreleri önlemek için zayıf bir başvuru kullanın. Referans her zaman bir değere sahipse, bunun yerine meşru olmayan bir referans kullanın.

Kör olabilir, ancak bunun UIAlertAction hakkındaki sorumu yanıtlamaya nasıl yardımcı olduğunu hala göremiyorum.

Yukarıdaki kodda, hayatının bir noktasındanil olabilir mi? Evet. Bu yüzden self'u weak olarak işaretlemeliyim.

Ama sonra tekrar kapatıldığında, self'un kapanacağı makul bir senaryoyu düşünemiyorum. Bu kapanma söz konusu olduğunda, selfher zaman bir değere sahip olacaktır. Bu yüzden self'u unowned olarak işaretlemeliyim.

Yani, bir UIAlertAction işleyicisinde self nasıl yakalanmalıdır?

cevap

40

Kendinize sormanız gereken en önemli soru, uyarı nesnesinin kendisinin "sahip olduğu" durumdur. Bu durumda, (işlev gövdesinde let alert = ... bildirdiğinizden) değildir. Bu yüzden bunu zayıf veya meşru olmayan bir referans olarak oluşturmanıza gerek yoktur. Eğer uyarım kendilik mülküyse, o zaman kendiliğinden “sahiplenilir” olur ve bu, uyarının “sahip olduğu” kapağın kendisinde zayıf bir referans oluşturmak istediğinizde gerçekleşecektir.

+0

Bunu "sahiplik" açısından görmek için zor bir zamanım var. Neden örnek çağıran örnek yöntemindeki yerel değişkenler neden örnek olarak adlandırılmamış ..? – Eric

+3

Yerel değişkenler yığına yerleştirilir ... ve yalnızca yığın/işlevin ömrü boyunca yaşayacaktır. Bunu oluşturduktan sonra, çağrılan işlevin kapsamı dışına çıktıktan sonra ömrünü yönetmek için görüntüleme denetleyicisine kalmıştır. Bu durumda, uyarının kendini tutması gerekir, ancak kendini daha az umursamaz. Fonksiyon çağrıldıktan sonra uyarı, başka bir şey (sunum yapan kontrolör) bununla ilgileniyor. –

+0

Bu nedenle, uyarı yerel bir değişkendir ise, kendi kendine güçlü bir referans tutmak her zaman tamam, aksi takdirde uyarı bir özellik ise, o zaman kendini zayıf bir referans tutmalıdır. Doğru? – Eric

İlgili konular