我想在与UITextFieldDelegate
分开的类中实现UIViewController
,但是当我这样做时,我会在运行时获得EXC_BAD_ACCESS
异常。
为什么这样做有效:
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;
}
}
答案 0 :(得分:7)
请注意delegate
的声明:
unowned(unsafe) var delegate: UITextFieldDelegate?
MyTextFieldDelegate()
已创建,已分配给delegate
,然后在createUI()
返回时取消分配。它被ARC取消分配,因为没有任何东西拥有它。您遇到的问题正是unsafe
警告您的问题。
您需要为MyTextFieldDelegate
实例创建强引用。您还需要保证在取消分配文本字段之后才释放委托。
请注意此行为与
weak
之间的区别。如果代表是weak
而不是unowned(unsafe)
,那么它将变为nil
并且永远不会被调用,而不是在被调用时崩溃。