1)不執(zhí)行dealloc?
1.看一下是不是循環(huán)引用造成的類不銷毀
2.調(diào)用其他類的時候查看有沒有將本類中的對象傳過去歧焦,例如self,self.tableview ??
傳的時候注意使用weak,不要使用strong
否則會造成當(dāng)前類無法釋放榴嗅,dealloc不執(zhí)行一直占用內(nèi)存鹅搪。
3.performSelector 關(guān)于內(nèi)存管理的執(zhí)行原理是這樣的執(zhí)行
?[self performSelector:@selector(method1:) withObject:self.tableLayer afterDelay:3]; 的時候,系統(tǒng)會將tableLayer的引用計數(shù)加1,執(zhí)行完這個方法時,還會將tableLayer的引用計數(shù)減1螟够,由于延遲這時tableLayer的引用計數(shù)沒有減少到0,也就導(dǎo)致了切換場景dealloc方法沒有被調(diào)用峡钓,出現(xiàn)了內(nèi)存泄露妓笙。?
利用如下函數(shù):?
[NSObject cancelPreviousPerformRequestsWithTarget:self] 當(dāng)然你也可以一個一個得這樣用:?
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(method1:) object:nil]?
加上了這個以后,順利地執(zhí)行了dealloc方法??
4.NSTimer使用造成的內(nèi)存泄露能岩。
注意自己需要管理NSTimer停止與釋放寞宫,否則,會一直運行拉鹃,導(dǎo)致頁面內(nèi)存不釋放辈赋。
例如: 在自定義View中鲫忍,如果不手動停止NSTimer對象,那么會一直NSTimer會一直持有這個類钥屈,導(dǎo)致內(nèi)存不釋放悟民,也就是內(nèi)存泄露。
解決方法:在controller中手動調(diào)用removeFromSuperView篷就,重寫- (void)removeFromSuperview 把_timer 停止釋放射亏。
- (void)removeFromSuperview {
??? [super?removeFromSuperview];
??? [_timerinvalidate];
????_timer?=nil;
}
2)延遲執(zhí)行dealloc?
本地在類撤銷之前有延時操作,未執(zhí)行完
比如:
[self performSelector:@selector(xx) withObject:nil afterDelay:10.0];
雖然現(xiàn)在大部分都是ARC工程竭业,系統(tǒng)幫你處理內(nèi)存管理智润,但這不等于開發(fā)者不用管理內(nèi)存。比如通知的移除未辆、baiduSDK中的變量置nil等都需要重寫dealloc方法來實現(xiàn)窟绷。注意,ARC工程是可以重寫dealloc方法并被系統(tǒng)調(diào)用的鼎姐,但不需要手動調(diào)用父類的dealloc钾麸,手寫[super dealloc]方法會報錯更振,事實上系統(tǒng)會自動幫你調(diào)用父類的dealloc方法炕桨,不需要你實現(xiàn)。
但有些時候會發(fā)現(xiàn)控制器出棧的時候不會調(diào)用dealloc方法肯腕,歸根結(jié)底献宫,是因為當(dāng)前控制器被某個對象強引用并“握住”了,控制器的引用計數(shù)不為0实撒,系統(tǒng)無法幫你釋放這部分內(nèi)存姊途。
控制器被強引用的原因:
1.block塊使用不當(dāng)。因為block會對方法中的變量自動retain一次知态。請檢查控制器中block代碼捷兰。
2.NSTimer沒有銷毀。
3.控制器中的代理屬性為retain负敏。應(yīng)把代理屬性改為assign贡茅。
目前遇到這些問題,日后遇到新的問題再添加上去.