         
         // increment chainingCount on every route
         for route in chain.routes {
-            handlerID = self.addHandler(route.transition) { context in
+            handlerID = self.addHandler(route.transition) { [weak self] context in
+                if self == nil { return }
+                let self_ = self!
                 
                 // skip duplicated transition handlers e.g. chain = 0 => 1 => 0 => 1 & transiting 0 => 1
                 if !shouldIncrementChainingCount { return }
                 
-                if self._canPassCondition(route.condition, transition: context.transition) {
+                if self_._canPassCondition(route.condition, transition: context.transition) {
                     if !shouldStop {
                         chainingCount++
 //                        println("[RouteChain] chainingCount++ =\(chainingCount), transition=\(route.transition)")

        
        // reset count on 1st route
        let firstRoute = chain.routes.first!
        var handlerID = self.addHandler(firstRoute.transition) { context in
            if self._canPassCondition(firstRoute.condition, transition: context.transition) {
                if shouldStop {
                    shouldStop = false
                    chainingCount = 0

        }
        
        // increment allCount (+ invoke chainErrorHandler) on any routes
        handlerID = self.addHandler(nil => nil, order: 150) { [weak self] context in
            
            shouldIncrementChainingCount = true
            
