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

Swift - Crash when UIButton.addTarget in init()

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")
}
}

在其他 class 我尝试通过单击此按钮执行 doSomething(),但我的应用程序崩溃失败...

var testvar = Test(view)

如何在应用程序不崩溃的情况下通过按下按钮触发此功能?

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

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

例如:

class FirstViewController: UIViewController {
    var testvar: Test!

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