下記のように階層化された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するにはどのような方法がベストなのでしょうか。