2015-01-19 11 views
6

Desidero implementare UITextFieldDelegate in una classe separata da UIViewController ma quando lo faccio ottengo un'eccezione EXC_BAD_ACCESS in fase di esecuzione.Implementazione di UITextFieldDelegate in una classe separata

Allora perché questo lavoro:

class MyViewController : UIViewController, UITextFieldDelegate 
{ 
    ... 

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

    ... 
    } 

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

ma questo non significa:

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

Provare a mettere il delegato appena creato in una variabile di classe "forte". È possibile che la proprietà "assign" del campo delegato stia provocando l'deallocazione subito dopo la sua creazione. –

risposta

7

nota la dichiarazione di delegate:

unowned(unsafe) var delegate: UITextFieldDelegate? 

MyTextFieldDelegate() è creato, assegnato a delegate e quindi deallocato quando restituisce createUI(). È deallocato da ARC perché nulla lo possiede. Il problema che stai riscontrando è esattamente ciò che ti informa di unsafe.

È necessario creare un riferimento sicuro all'istanza MyTextFieldDelegate. È inoltre necessario garantire che il delegato non sia stato rilasciato fino a quando il campo di testo non viene deallocato.

Notare la differenza tra questo comportamento e weak. Se il delegato fosse weak anziché unowned(unsafe), diventerebbe nil e non verrà mai chiamato, invece di arrestarsi quando viene chiamato.

+1

Grazie per quello, tutti i miei anni di Java mi hanno fatto dare per scontata la gestione della memoria ... –

Problemi correlati