我想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;
}
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意以下声明delegate:
unowned(unsafe) var delegate: UITextFieldDelegate?
Run Code Online (Sandbox Code Playgroud)
MyTextFieldDelegate()delegate在createUI()返回时创建,分配,然后取消分配.它被ARC取消分配,因为没有任何东西拥有它.您遇到的问题正是unsafe警告您的问题.
您需要为MyTextFieldDelegate实例创建强引用.您还需要保证在取消分配文本字段之前不会释放委托.
注意这种行为与之间的区别
weak.如果委托weak代替unowned(unsafe),那么它将变为nil并且永远不会被调用,而不是在被调用时崩溃.