iOS中控制器的釋放問題


iOS中控制器的釋放問題

  • 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銷毀。
     [timer invalidate]; // 銷毀timer
timer = nil; // 置nil

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

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

控制器中block的循環引用

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

  • __weak typeof(self) weakSelf = self;
  • 即:保險起見block中所有的涉及到self的全給替換成weakSelf

  • 這個控制器問題在程序中一直不被釋放,困擾了好久,萬惡的循環引用。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com