When I have a view controller pushed to navigation stack of UINavigationController I create a scroll view and add one to the View of the view controller. The view controller is then set as WeakDelegate of the scroll view added. When the view controller is then popped from the navigation stack it doesn't get released (Dispose(disposing) method is not called). Seems like WeakDelegate reference is keeping it alive, but I don't pretty understand why garbage collector doesn't collect the view controller that is not referenced from anywhere else. A simple test project is here.