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