Cocoa touchのデリゲートメソッドの呼び出しとメモリ管理について
iOS(Swift)でアプリを開発しています。
カスタムViewを作成し、あるViewControllerにaddSubviewし、そのViewControllerにカスタムViewから呼び出されるデリゲートメソッドを実装しています。
このとき、以下のようにCustomView内のUIButtonから直接メソッドの呼び出しを行うと、"unrecognized selector sent to instance xxxx"と、メモリに関するエラーでアプリが落ちてしまいます。
SampleViewController
class SampleViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let customView = CustomView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
self.view.addSubview(customView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func sampleFunc() {
print("sampleFunc")
}
}
CustomView
class CustomView: UIView {
let button = UIButton(frame: CGRectZero)
func setup() {
button.addTarget(self, action: #selector(SampleViewController.sampleFunc(_:)), forControlEvents: .TouchUpInside)
self.addSubview(button)
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
// 略
}
}
一方で、CustomView内に別のメソッドを用意し、そのメソッドから間接的にViewController内のデリゲートメソッドを呼び出した場合は正常に動作しました。
CustomView(修正後)
class CustomView: UIView {
let button = UIButton(frame: CGRectZero)
func setup() {
button.addTarget(self, action: #selector(CustomView.buttonAction(_:)), forControlEvents: .TouchUpInside)
self.addSubview(button)
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
// 略
}
@objc private func buttonAction(sender: AnyObject) {
UIApplication.sharedApplication().sendAction(#selector(SampleViewController.sampleFunc(_:)), to: nil, from: self, forEvent: nil)
}
}
これがなぜ間接的に呼び出した場合は成功するのかがわからず、お分かりになる方がいれば教えていただきたいです。宜しくお願いします。