iOS中控制器的釋放問題

ARC工程是能夠重寫dealloc方法並被系統調用的,但不須要手動調用父類的dealloc,手寫[super dealloc]方法會報錯,事實上系統會自動幫你調用父類的dealloc方法,不須要你實現。能夠經過在dealloc方法中打印log查看控制器是否被釋放。app

控制器在被pop後移出棧後會被釋放,但有些時候會發現控制器出棧的時候不會調用dealloc方法,歸根結底,是由於當前控制器被某個對象強引用了,控制器的引用計數不爲0,系統沒法幫你釋放這部份內存。atom

控制器中NSTimer沒有被銷燬

當控制器中存在NSTimer時,就須要注意,由於當[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];時,這個/target:self/ 就增長了VC的RetarnCountr, 若是你不將這個timer invalidate,就別想調用dealloc。須要在viewWillDisappear以前須要把控制器用到的NSTimer銷燬。spa

  • [timer invalidate]; // 銷燬timer代理

  • timer = nil; // 置nilorm

控制器中的代理不是weak屬性

例如@property (nonatomic, weak) id<HCAppViewDelegate> delegate;代理要使用弱引用,由於自定義控件是加載在視圖控制器中的,視圖控制器view對自定義控件是強引用,
若是代理屬性設置爲strong,則意味着delegate對視圖控制器也進行了強引用,會形成循環引用。致使控制器沒法被釋放,最終致使內存泄漏。對象

控制器中block的循環引用

block會把它裏面的全部對象強引用(在ARC下)/PS:MRC下會retain加1/,包括當前控制器self,所以有可能會出現循環引用的問題。
即一個對象有一個Block屬性,然而這個Block屬性中又引用了對象的其餘成員變量,那麼就會對這個變量自己產生強應用,那麼這個對象自己和他本身的Block屬性就造成了循環引用。在ARC下須要修改爲這樣:(/也就是生成一個對自身對象的弱引用/)內存

  • __weak typeof(self) weakSelf = self;get

即:保險起見block中全部的涉及到self的全給替換成weakSelfit

相關文章
相關標籤/搜索