1.靜態(tài)分析
使用XCode分析功能率拒,Product->Analyze
使用靜態(tài)檢測可以檢查出一些明顯的沒有釋放的內(nèi)存诚些,包括NSObject和CF開頭的內(nèi)存泄漏神帅,最常見問題有2種可都,這些問題都不復(fù)雜膀值,需要的是細(xì)心:
MRC的文件,經(jīng)常遺漏release或者autorelease栅葡。
C方式申請的內(nèi)存茉兰,忘記釋放了。
//1
static inline NSString* iphone_device_info(){
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = (char*)malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
...
}
//2
if (alpha != 1) {
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGColorRef color = CGColorCreate(colorSpaceRef, (CGFloat[]){255, 255, 255, 0.3});
[btn.layer setBorderColor:color];
}
不過在修改時應(yīng)該注意:
這些場景是否真的泄漏了欣簇,以免重復(fù)釋放规脸。
注意該文件是MRC還是ARC,需要不同的內(nèi)存處理方式熊咽。
如果是C申請的內(nèi)存莫鸭,注意new delete, malloc free的配對處理横殴。
比如我們的代碼中會遇到這樣的問題被因。
if ([self.itemOutput hasNewPixelBufferForItemTime:currentTime]) {
[self displayPixelBuffer:[self.itemOutput copyPixelBufferForItemTime:currentTime itemTimeForDisplay:NULL]];
[_program useGlProgram];
}
進行靜態(tài)檢測時會報copyPixelBufferForItemTime內(nèi)存泄漏,copy后的對象需要進行釋放衫仑,可事實上梨与,在“displayPixelBuffer”函數(shù)中已經(jīng)對傳入對內(nèi)存進行了釋放,我們姑且不論這樣對寫法是否合理文狱,只是切記在修改時注意結(jié)合上下文處理需要釋放的內(nèi)存粥鞋。
2.動態(tài)檢測 使用instruments
在Allocation中我們主要關(guān)注的是Persistent和Persistent Bytes,分別表示當(dāng)前時間段如贷,申請了但是還沒釋放的內(nèi)存數(shù)量和大小陷虎。
記住當(dāng)前這兩個值,然后進入某個新頁面杠袱,退出該頁面尚猿,觀察這兩個值是否增加。需要注意的是楣富,由于有些圖片調(diào)用本身是有緩存的凿掂,如果是用SDWebImage管理,則網(wǎng)絡(luò)圖片都會緩存在內(nèi)存中纹蝴。因此退出頁面后內(nèi)存有增加是正常的庄萎,而且還有些單例的內(nèi)存也是不會釋放的,我們可以再次進入同一個頁面塘安,在圖片都加載過的情況下糠涛,反復(fù)進入退出查看內(nèi)存狀況,如果持續(xù)增加兼犯,則說明有泄漏忍捡。