2015-01-19 19 views
6

UITextFieldDelegate'u UIViewController'dan ayrı bir sınıfta uygulamak istiyorum ancak ne zaman çalışma zamanında bir EXC_BAD_ACCESS istisnası alıyorum.UITextFieldDelegate uygulamasının ayrı bir sınıf içinde uygulanması

Peki neden bu işi yapar:

class MyViewController : UIViewController, UITextFieldDelegate 
{ 
    ... 

    func createUI() 
    { 
    let someTextField: UITextField = UITextField() 
    someTextField.delegate = self 

    ... 
    } 

    func textFieldShouldReturn(textField: UITextField!) -> Bool 
    { 
    textField.resignFirstResponder() 
    return true; 
    } 
} 

Ama bu değil:

class MyViewController : UIViewController 
{ 
    ... 

    func createUI() 
    { 
    let someTextField: UITextField = UITextField() 
    someTextField.delegate = MyTextFieldDelegate() 

    ... 
    } 
} 

class MyTextFieldDelegate : NSObject, UITextFieldDelegate 
{ 
    func textFieldShouldReturn(textField: UITextField!) -> Bool 
    { 
    textField.resignFirstResponder() 
    return true; 
    } 
} 
+1

Yeni oluşturulan delegeyi "güçlü" sınıf değişkenine koymayı deneyin. Temsilci alanının "atama" özelliğinin, oluşturulduktan hemen sonra ayrılmasına neden olması mümkündür. –

cevap

7

Not delegate beyanı:

MyTextFieldDelegate()

unowned(unsafe) var delegate: UITextFieldDelegate? 
oluşturulur, delegate atanan ve sonra createUI() döndüğünde ayrılan. ARC tarafından tahsis edilmiştir, çünkü hiçbir şeyin sahibi değildir. Karşılaştığınız sorun, tam olarak unsafe'un sizi uyarmasıdır.

MyTextFieldDelegate örneğiniz için güçlü bir başvuru oluşturmanız gerekiyor. Ayrıca, metin alanı serbest bırakılıncaya kadar delege dağıtılmadığını garanti etmelisiniz.

Bu davranış ile weak arasındaki farka dikkat edin. Temsilci, unowned(unsafe) yerine weak olsaydı, nil olur ve arandığında kilitlenme yerine, asla çağrılmaz.

+1

Bunun için tüm Java yıllarım bana verilen bellek yönetimini almamı sağladı. –