[instrument](http://blog.csdn.net/totogo2010/article/details/8233565)
第一.本地圖片緩存問(wèn)題
_1.發(fā)現(xiàn)問(wèn)題_
寫了一個(gè)demo,由于不與后臺(tái)交互,所以一些圖片資源和背景都放到了工程中,加載刷新的卡片等也是從工程中直接導(dǎo)入而非后臺(tái)請(qǐng)求,導(dǎo)致項(xiàng)目在運(yùn)行中出現(xiàn)了內(nèi)存暴漲問(wèn)題,如果 有86%的內(nèi)存都是 imageIO_Malloc 導(dǎo)致的! 嘗試清空所有背景圖片 內(nèi)存有80多M直接降為20多M 且穩(wěn)定在怎么 push 和 pop都不會(huì)增加內(nèi)存;
_2.解決方法_
_棄用方法中的 _
ima.image = [UIImage imageNamed:@"battle_navigation_bar"];
_ 改用_
NSString *imageFile = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],@"battle navigation bar"];
ima.image = [[UIImage alloc] initWithContentsOfFile:imageFile];
_最后在 viewWillDisappear 或者 viewDidDisappear方法里面清空當(dāng)前加載圖片的視圖或者父視圖_
self.view = nil;
_ 你會(huì)發(fā)現(xiàn)不論是 push 還是 pop 控制器,包括彈出視圖,相關(guān)的本地圖片緩存得到解決,內(nèi)存不在增加!_
_ 3.內(nèi)存泄漏查看 (Xcode 自帶工具)_
打開(kāi)項(xiàng)目,點(diǎn)擊 product , 選擇 Analyze , 項(xiàng)目會(huì)自動(dòng)運(yùn)行,運(yùn)行完畢后,如果出現(xiàn)下圖情況,說(shuō)明內(nèi)存泄漏,藍(lán)色的代表就是泄漏地方,需要更改!
如果是下圖情況,沒(méi)有藍(lán)色的東西,則代表不需要更改!
_ 4.內(nèi)存占用查看 (Xcode 自帶工具 : instruments)_
_打開(kāi)項(xiàng)目,點(diǎn)擊 product , 選擇 Profile , 連接真機(jī),出現(xiàn)如圖情況_
_選擇 Call Trees , 點(diǎn)擊左上方紅色按鈕運(yùn)行_
第二.內(nèi)存警告方法相關(guān)
1:只要出現(xiàn)內(nèi)存警告的時(shí)候娱挨,會(huì)第一時(shí)間執(zhí)行 appdelegate的DidReceiveMemoryWarning方法豹芯,所以我們先要在這里對(duì)正在下載的圖片進(jìn)行處理
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
NSLog(@"內(nèi)存警告了??????????????");
SDWebImageManager *mgr = [SDWebImageManager sharedManager];
// 1.取消正在下載的操作
[mgr cancelAll];
// 2.清除內(nèi)存緩存
[mgr.imageCache clearMemory];
}
2:遇到內(nèi)存警告后,在每一個(gè)VC中 都有didReceiveMemoryWarning方法堰乔,來(lái)接受內(nèi)存警告的通知,所以我們也需要在這里進(jìn)行處理谜叹,將沒(méi)有顯示的VC的self.view置空 釋放內(nèi)存
- (void)didReceiveMemoryWarning {
NSLog(@"內(nèi)存警告my");
[super didReceiveMemoryWarning];//即使沒(méi)有顯示在window上昆稿,也不會(huì)自動(dòng)的將self.view釋放侠碧。注意跟ios6.0之前的區(qū)分
// 此處做兼容處理需要加上ios6.0的宏開(kāi)關(guān),保證是在6.0下使用的,6.0以前屏蔽以下代碼廉丽,否則會(huì)在下面使用self.view時(shí)自動(dòng)加載viewDidUnLoad
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
//需要注意的是self.isViewLoaded是必不可少的倦微,其他方式訪問(wèn)視圖會(huì)導(dǎo)致它加載,在WWDC視頻也忽視這一點(diǎn)正压。
if (self.isViewLoaded && !self.view.window)// 是否是正在使用的視圖
{
self.view = nil;// 目的是再次進(jìn)入時(shí)能夠重新加載調(diào)用viewDidLoad函數(shù)欣福。
}
}
3:上面兩步其實(shí)已經(jīng)能解決大部分內(nèi)存警告的問(wèn)題了,最后還有點(diǎn)小優(yōu)化焦履。就是使用自帶的圖片時(shí)拓劝,最好使用
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:A ofType:nil]];
而不是
[UIImage imageNamed:[UIUtil imageName:@"1.png"]];
因?yàn)榍罢咧苯幼x取圖片,不加入緩存嘉裤,后者是需要加入緩存的郑临,會(huì)增加內(nèi)存負(fù)擔(dān)
所以前者性能優(yōu)于后者