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内に下記の記述をしています。

[code]

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
        var subviews = self.subviews
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
    
[/code]

MainViewControllerからC_UIViewを削除する時の記述は下記の通りです。

[code]

    self.C_UIView!.removeFromSuperview()
    self.C_UIView = nil
    
[/code]

すると、階層の深さに関係なくUIViewの中にあるanimateWithDurationについて、completionでEXC_BAD_ACCESSが発生してしまいます。

[code]

    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
        }
    )
    
[/code]

completionを削除すると問題なく動き、またどのアニメーションだから特別に発生するということはなく、おそらく参照や多重解放などが原因かとは思うのですが、親がremoveされた時に子供も全てremoveするにはどのような方法がベストなのでしょうか。




かなり時間が経っていますが、原因が確実になりましたので自己レスいたします。

結果的に原因は[unowned self]でした。

この記述を[weak self]に変更し、selfのものが参照されたときにnilであれば参照しないようにしてやることで、落ちることがなくなりました。

ありがとうございました。




かなり時間が経っていますが、原因が確実になりましたので自己レスいたします。

結果的に原因は[unowned self]でした。

この記述を[weak self]に変更し、selfのものが参照されたときにnilであれば参照しないようにしてやることで、落ちることがなくなりました。

ありがとうございました。

