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