 
     }
     
+    
+    // FIXME: for current controller can not be released due to unfound retain cycle, we remove notification in viewDidDisappear for temporary
+    override public func viewDidDisappear(animated: Bool) {
+        super.viewDidDisappear(animated)
+        clearForNotification()
+    }
     deinit {
         collectionView?.delegate = nil
         collectionView?.dataSource = nil

    /// Scroll to the bottom of message collection view
    final public func scrollToBottom(animated animated: Bool) {
        guard collectionView?.numberOfSections() != 0 else { return }
        
        let lastIndexPath: NSIndexPath = NSIndexPath(forItem: collectionView!.numberOfItemsInSection(0) - 1, inSection: 0)
        scrollTo(indexPath: lastIndexPath, animated: animated)

    }
    
    public func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        guard let _ = collectionView as? DUMessageCollectionView else {
            assert(false, "Error collectionView class : \(collectionView.nameOfClass), supposed to be \(DUMessageCollectionView.nameOfClass)")
            return UICollectionViewCell() // this line will not be executed for previous assertion
