自從項目中導入MyLeaksFinder以來,項目中就經常會報Memory Leak的提示,經過幾次調試終於總結到這種情況可能出現的幾種原因:
1,VC中使用瞭NSTimer計時器,使用計時器當VC進行push ——pop之後,如果NSTimer對象沒有進行銷毀,就會造成內存泄漏,也就是引用瞭當前VC,導致控制器的引用計數加1,如果沒有將這個NSTimer 銷毀,它將一直保留該VC,無法釋放,也就不會調用dealloc方法。所以,需要在viewWillDisappear之前需要把控制器用到的NSTimer銷毀。
銷毀方法:[timer invalidate]; // 銷毀timer
timer = nil; // 置nil
或者在GCD中的銷毀方法:
dispatch_source_cancel(_timer);
2,Block代碼塊中使用瞭強引用self,容易造成循環引用,對象長時間不能釋放而引起的。
具體可以:
#define WS(weakSelf)? __weak __typeof(self)weakSelf = self;
使用弱引用weakSelf來代替self,
或者項目在回調代碼塊中調用內部成員變量及屬性時的self.name或者_name都會引起循環引用,具體方法同上。
3,就是可能在項目VC中采用的代理方法屬性的代理不是weak屬性具體的方法如下:
:@property (nonatomic, weak) id delegate;
剩下具體還可能造成的原因還在進一步探索中,如果有新的可能造成的原因也歡迎大傢在評論區補充