問(wèn)題描述
最近在一個(gè)項(xiàng)目中用到了地圖,發(fā)現(xiàn)在地圖頁(yè)面和上一個(gè)頁(yè)面間反復(fù)切換回出現(xiàn)內(nèi)存爆增的情況,就像吃了炫邁一樣根本停不下來(lái)(直到app內(nèi)存爆表,app閃退收?qǐng)觯T斐蛇@一結(jié)果的根本原因是地圖的mapView沒(méi)有釋放,導(dǎo)致每次打開(kāi)地圖界面的時(shí)候內(nèi)存中都重新加載了一個(gè)地圖mapView。于是在網(wǎng)上搜索了一番找到了解決辦法,只需要在地圖的ViewController中dealloc方法中釋放掉mapView就行了。具體代碼如下:
- (void)dealloc {?
? [_mapView release];? ?
? [superdealloc];
}
//并且在界面將要顯示的時(shí)候設(shè)置代理,將要消失的時(shí)候取消代理
- (void)viewWillAppear:(BOOL)animated {?
? _mapView.delegate=self;
}
- (void)viewWillDisappear:(BOOL)animated {
?? _mapView.delegate=nil;
}
以上給出的方法確實(shí)是對(duì)的,可以解決反復(fù)切換地圖頁(yè)面和地圖上一級(jí)頁(yè)面內(nèi)存暴增造成的閃退問(wèn)題。但是這里要說(shuō)的不是這個(gè)問(wèn)題,而是一個(gè)新的問(wèn)題,我在dealloc中打了斷點(diǎn),但是dealloc根本就沒(méi)有執(zhí)行,所以mapView也就根本就沒(méi)有釋放,內(nèi)存還是一樣在暴增。為什么ViewController已經(jīng)被pop了,而ViewController的dealloc方法卻沒(méi)有被調(diào)用?(按理說(shuō)ViewController被pop的時(shí)候它的dealloc的方法應(yīng)該被調(diào)用才對(duì))。
通過(guò)Google搜索終于在晚上找到了答案(大家就不要用百度,想要快速準(zhǔn)確的找到自己想要的答案推薦大家用google)。造成ViewController不釋放的原因可能有很多。遇到dealloc不調(diào)用的時(shí)候只需要檢查您的ViewController中是否存在以下幾個(gè)問(wèn)題:
ViewController中存在NSTimer
如果你的ViewController中有NSTimer,那么你就要注意了,因?yàn)楫?dāng)你調(diào)用
[NSTimer scheduledTimerWithTimeInterval:1.0target:selfselector:@selector(updateTime:)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? userInfo:nilrepeats:YES];
時(shí),這個(gè)target:self就增加了ViewController的return count,如果你不將這個(gè)timer invalidate,將別想調(diào)用dealloc。
ViewController中有關(guān)的代理
一個(gè)比較隱秘的因素,你去找找與這個(gè)類有關(guān)的代理,有沒(méi)有強(qiáng)引用屬性?比如一個(gè)代理的delegate應(yīng)該是 assign 的現(xiàn)在是retain,(╯‵□′)╯︵┻━┻,就是這個(gè),它會(huì)影響你不讓你調(diào)用dealloc,不信,就試試吧。(這個(gè)我還沒(méi)有遇到過(guò))。
ViewController中有Block
這個(gè)就是我我上面不進(jìn)入dealloc的真正原因,Block體內(nèi)使用實(shí)例變量也會(huì)造成循環(huán)引用,使得擁有這個(gè)實(shí)例的對(duì)象不能釋放。
例如你這個(gè)類叫OneViewController,有個(gè)屬性是NSString *name; 如果你在block體中使用了self.name,那樣子的話這個(gè)類就沒(méi)法釋放。
要解決這個(gè)問(wèn)題,MRC下只需
__block Viewcontroller *weakSelf=self;
ARC下將__block 換為 __weak
目前我所知道的就以上三種情況,如果有什么錯(cuò)誤的地方或者還存在的一些情況,歡迎大家來(lái)補(bǔ)充。
轉(zhuǎn)載請(qǐng)注明出處,原文地址:http://www.jvaeyhcd.cc2016/04/06/iOS中造成dealloc不調(diào)用的原因/