2015-01-19 2 views
6

UIViewController과는 별도로 UITextFieldDelegate 클래스를 구현하고 싶지만 런타임에 EXC_BAD_ACCESS 예외가 발생합니다.별도의 클래스에서 UITextFieldDelegate 구현

는 왜이 작업을 수행합니다

class MyViewController : UIViewController, UITextFieldDelegate 
{ 
    ... 

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

    ... 
    } 

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

을하지만이되지 않습니다 :

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

새로 만든 대리인을 "강력한"클래스 변수에 넣어보십시오. 델리게이트 필드의 "assign"속성으로 인해 생성 된 직후 할당 해제가 발생할 수 있습니다. –

답변

7

delegate의 선언 :

MyTextFieldDelegate()

unowned(unsafe) var delegate: UITextFieldDelegate? 
가 생성, delegate에 할당을 , 그런 다음 createUI()이 반환되면 할당이 취소됩니다. 아무것도 소유하지 않기 때문에 ARC가 할당을 해제합니다. 발생한 문제는 바로 unsafe에 대한 경고입니다.

MyTextFieldDelegate 인스턴스에 대한 강력한 참조를 만들어야합니다. 또한 텍스트 필드가 할당 해제 될 때까지 대리자가 할당 취소되지 않도록해야합니다.

이 동작과 weak의 차이점에 유의하십시오. 위임자가 unowned(unsafe) 대신 weak 인 경우 nil이되어 호출 할 때 충돌하는 대신 절대로 호출되지 않습니다.

+1

그 덕분에, Java의 모든 내게 당연한 추억을 가져다주었습니다 ... –

관련 문제