removeFromSuperview時にanimateWithDurationのcompletionにEXC_BAD_ACCESS
下記のように階層化されたViewがあるとします。
MainViewController: ViewController
|- A_UIView: UIView
|- B_UIView: UIView
|- C_UIview: UIView
|- C_a_UIView: UIView
|- C_b_UIView: UIView
全てのUIViewで、自分の子要素を削除するためにdeinit内に下記の記述をしています。
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
var subviews = self.subviews
for subview in subviews {
subview.removeFromSuperview()
}
}
MainViewControllerからC_UIViewを削除する時の記述は下記の通りです。
self.C_UIView!.removeFromSuperview()
self.C_UIView = nil
すると、階層の深さに関係なくUIViewの中にあるanimateWithDurationについて、completionでEXC_BAD_ACCESSが発生してしまいます。
UIView.setAnimationBeginsFromCurrentState(true)
UIView.animateWithDuration(
0.7,
animations: {[unowned self]() -> Void in
self.alpha = 0.0
return
},
completion: {[unowned self](Bool) -> Void in <-この行で!
self.hidden = false
}
)
completionを削除すると問題なく動き、またどのアニメーションだから特別に発生するということはなく、おそらく参照や多重解放などが原因かとは思うのですが、親がremoveされた時に子供も全てremoveするにはどのような方法がベストなのでしょうか。