iOS中造成dealloc不調(diào)用的原因

問(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)用的原因/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容