在iOS開發(fā)中,如果一個控制器pop之后不走dealloc方法,那就會反復創(chuàng)建多次這個界面,造成內(nèi)存泄漏,甚至會崩潰,造成這一現(xiàn)象的原因有幾個:
1:控制器中使用了定時器,沒有及時銷毀,所以在使用定時器時,一定要在合適的地方銷毀
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
//取消定時器
[scanTimer invalidate];
scanTimer = nil;
[addTimeOutTimer invalidate];
addTimeOutTimer = nil;
[addDeviceTimer invalidate];
addDeviceTimer = nil;
[bindDeviceTimer invalidate];
bindDeviceTimer = nil;
}
2:block循環(huán)引用,如果在block中使用了self,或者類的某個屬性,會造成控制器和block循環(huán)引用,無法釋放,比較常見的例子是MJRefresh中的block
__weak __typeof(self)weakSelf = self;
self.deviceMessageListTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
__strong typeof(self) strongself = weakSelf;
[strongself loadDeviceMessageData];
}];
這樣寫,就沒問題了
3:控制器類中用了其他了類的對象做屬性時。要用weak,而不是strong,我的項目最后就是這個問題找了好長時間,具體原因我也不知道,反正這樣用就沒問題了
4:控制器中的代理要用weak修飾,不能用strong
@property (nonatomic, weak) id delegate;
大多數(shù)情況都是這幾個原因,我的我的項目就是這樣改的,如果有其他的歡迎補充.