Swift - 在init()中UIButton.addTarget崩溃

时间:2015-03-04 07:22:13

标签: ios swift uibutton

class Test: NSObject {

init(mainView:UIView){
   super.init()
   var button = UIButton.buttonWithType(UIButtonType.System) as! UIButton
   button.setTitle("Test", forState: UIControlState.Normal)
   button.backgroundColor = UIColor.whiteColor()
   button.frame = CGRectMake(0, 0, 250, 40)
   button.addTarget(self, action: "doSomething", forControlEvents: UIControlEvents.TouchUpInside)
   mainView.addSubview(button)
}
func doSomething(){
   println("test")
}
}

在其他课程中,我尝试通过点击此按钮来做Something(),但我的应用程序崩溃失败......

var testvar = Test(view)

如何在没有应用程序崩溃的情况下按下按钮来触发此功能?

1 个答案:

答案 0 :(得分:2)

这是一个内存管理问题。您的问题是,在您离开方法后,您将在本地变量Test中存储的testvar实例将被释放。 UIButton方法的addTarget不会保留它的目标,因此不再有对Test实例的强引用,它将被释放。如果点击该按钮,系统会尝试在现已解除分配的实例上调用doSomething。这会导致崩溃。

您可以将实例存储在UIViewController的实例变量中(或任何对象调用var testvar =)。

例如:

class FirstViewController: UIViewController {
    var testvar: Test!

    override func viewDidLoad() {
        super.viewDidLoad()
        testvar = Test(mainView:self.view)
    }
}