If you give strong property to your delegate, it will increase retain count. When you pop from navigation queue, it also just decrease retain count. So even-though you pop
your view controller, it have retain count via delegate(if strong). Your dealloc only gets call when retain count is 0
Notes: When you set nil
to delegate in Disappear, your assigned delegate decrease
retain count via setter method
and assign nil to delegate. That's why, it get call when set nil.
So you can declare you delegate as weak
as like
@property (nonatomic, weak) id<Protocol> delegate;