標籤:
ARC工程是可以重寫dealloc方法並被系統調用的,但不需要手動調用父類的dealloc,手寫[super dealloc]方法會報錯,事實上系統會自動幫你調用父類的dealloc方法,不需要你實現。可以通過在dealloc方法中列印log查看控制器是否被釋放。
控制器在被pop後移出棧後會被釋放,但有些時候會發現控制器出棧的時候不會調用dealloc方法,歸根結底,是因為當前控制器被某個對象強引用了,控制器的引用計數不為0,系統無法幫你釋放這部分記憶體。
控制器中NSTimer沒有被銷毀
當控制器中存在NSTimer時,就需要注意,因為當[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];時,這個/target:self/ 就增加了VC的RetarnCountr, 如果你不將這個timer invalidate,就別想調用dealloc。需要在viewWillDisappear之前需要把控制器用到的NSTimer銷毀。
控制器中的代理不是weak屬性
例如@property (nonatomic, weak) id<HCAppViewDelegate> delegate;代理要使用弱引用,因為自訂控制項是載入在視圖控制器中的,視圖控制器view對自訂控制項是強引用,
如果代理屬性設定為strong,則意味著delegate對視圖控制器也進行了強引用,會造成循環參考。導致控制器無法被釋放,最終導致記憶體流失。
控制器中block的循環參考
block會把它裡面的所有對象強引用(在ARC下)/PS:MRC下會retain加1/,包括當前控制器self,因此有可能會出現循環參考的問題。
即一個對象有一個Block屬性,然而這個Block屬性中又引用了對象的其他成員變數,那麼就會對這個變數本身產生強應用,那麼這個對象本身和他自己的Block屬性就形成了循環參考。在ARC下需要修改成這樣:(/也就是產生一個對自身對象的弱引用/)
即:保險起見block中所有的涉及到self的全給替換成weakSelf
iOS中控制器的釋放問題