控制器在被pop後移出棧後會被釋放,但有些時候會發現控制器出棧的時候不會調用dealloc方法,歸根結底,是由於當前控制器被某個對象強引用了,控制器的引用計數不爲0,系統沒法幫你釋放這部份內存。app
當控制器中存在NSTimer時,就須要注意,由於當[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];時,這個/target:self/ 就增長了VC的RetarnCountr, 若是你不將這個timer invalidate,就別想調用dealloc。須要在viewWillDisappear以前須要把控制器用到的NSTimer銷燬。atom
[timer invalidate]; // 銷燬timer代理
timer = nil; // 置nil對象
例如@property (nonatomic, weak) id<HCAppViewDelegate> delegate;代理要使用弱引用,由於自定義控件是加載在視圖控制器中的,視圖控制器view對自定義控件是強引用,
若是代理屬性設置爲strong,則意味着delegate對視圖控制器也進行了強引用,會形成循環引用。致使控制器沒法被釋放,最終致使內存泄漏。內存
block會把它裏面的全部對象強引用(在ARC下)/PS:MRC下會retain加1/,包括當前控制器self,所以有可能會出現循環引用的問題。
即一個對象有一個Block屬性,然而這個Block屬性中又引用了對象的其餘成員變量,那麼就會對這個變量自己產生強應用,那麼這個對象自己和他本身的Block屬性就造成了循環引用。在ARC下須要修改爲這樣:(/也就是生成一個對自身對象的弱引用/)get
__weak typeof(self) weakSelf = self;it
即:保險起見block中全部的涉及到self的全給替換成weakSelf變量