- 使用Xcode自帶的靜態(tài)分析工具 Product->Analyze(快捷鍵command+shift+B)可以找出代碼潛在錯(cuò)誤,如內(nèi)存泄露,未使用函數(shù)和變量等
所謂靜態(tài)內(nèi)存分析, 是指在程序沒(méi)運(yùn)行的時(shí)候, 通過(guò)工具對(duì)代碼直接進(jìn)行分析
根據(jù)代碼的上下文的語(yǔ)法結(jié)構(gòu), 讓編譯器分析內(nèi)存情況, 檢查是否有內(nèi)存泄露
Analyze主要分析以下四種問(wèn)題:
- 1、邏輯錯(cuò)誤:訪問(wèn)空指針或未初始化的變量等;
- 2、內(nèi)存管理錯(cuò)誤:如內(nèi)存泄漏等; 比如ARC下,內(nèi)存管理不包括core foundation
- 3、聲明錯(cuò)誤:從未使用過(guò)的變量;
- 4、Api調(diào)用錯(cuò)誤:未包含使用的庫(kù)和框架。
缺點(diǎn): 靜態(tài)內(nèi)存分析由于是編譯器根據(jù)代碼進(jìn)行的判斷, 做出的判斷不一定會(huì)準(zhǔn)確, 因此如果遇到提示, 應(yīng)該去結(jié)合代碼上文檢查一下
// 面向用戶的文本應(yīng)該使用本地化的字符串宏
1.user-facing text should use localized string macro
此為代碼中配置了本地化,面向用戶的應(yīng)該用字符串宏,而我們直接賦值為漢字,因此,此提示可以忽略.
2.instance variable used while 'self' is not set to the result of '[(super or self) init...]
// 此方法提示錯(cuò)誤
- (instancetype)initWithType:(FTFFavorateType)type
{
if (self == [super init]) {
_type = type;
}
return self;
}
修改為如下
- (instancetype)initWithType:(FTFFavorateType)type
{
if (self = [super init]) {
_type = type;
}
return self;
}
// 在初始化過(guò)程中存儲(chǔ)的“持續(xù)時(shí)間值”的值永遠(yuǎn)不會(huì)被讀取
3.Value stored to ‘durationValue’ during its initialization is never read
// 此段代碼提示錯(cuò)誤
NSMutableArray *datesArray = [[NSMutableArray alloc] init];
datesArray = [_onDemandDictionary objectForKey:key];
這是因?yàn)?code>[NSMutableArray alloc] init]初始化分配了內(nèi)存,而判斷語(yǔ)句里面[_onDemandDictionary objectForKey:key]方法也相當(dāng)于初始化分配了內(nèi)存,就是把初始化的一個(gè)新的可變數(shù)組賦值給之前已經(jīng)初始化過(guò)的可變數(shù)組,看似沒(méi)什么大問(wèn)題,其實(shí)存在一個(gè)數(shù)據(jù)源卻申請(qǐng)了兩塊內(nèi)存的問(wèn)題,已經(jīng)造成了內(nèi)存泄露。
修改為如下
NSMutableArray *datesArray = nil;
datesArray = [_onDemandDictionary objectForKey:key];
Analyze已經(jīng)分析出imageRef對(duì)象有內(nèi)存泄漏,這種情況在編譯時(shí)是無(wú)法發(fā)現(xiàn)的。
//截取部分圖像
+(UIImage*)getSubImage:(unsigned long)ulUserHeader
{
UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
CGFloat height = sourceImage.size.height;
CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
//CGImageRelease(imageRef);
return smallImage;
}
Analyze邏輯錯(cuò)誤監(jiān)測(cè):

這種情況在codereview時(shí)也較難發(fā)現(xiàn),可以借助Analyze。
如上代碼,當(dāng)Tag不等于1、2和3的時(shí)候,就會(huì)出現(xiàn)很問(wèn)題了。
Analyze還給出了箭頭提示:len is a garbage value。建議在聲明變量時(shí),同時(shí)進(jìn)行初始化。