最近在使用Analyze分析一個老項目中的代碼時林艘,發(fā)現(xiàn)了很多問題。感覺其中有的問題本不該出現(xiàn)宪塔,當(dāng)然有些問題也需要在今后的開發(fā)中多注意。現(xiàn)將遇到的相關(guān)錯誤信息總結(jié)如下囊拜。
一某筐、Core Foundation/Objective-C(CF/OC語法)
1、The 'viewWillAppear:' instance method in UIViewController subclass 'xxx' is missing a [super viewWillAppear:] call
解釋:UIViewController子類'xxx'中的'viewWillAppear:'實例方法缺少[super viewWillAppear:]調(diào)用冠跷。
分析:在viewWillAppear
中加上[super viewWillAppear:]
即可南誊。
2、Instance variable used while 'self' is not set to the result of '[(super or self) init…]'
解釋:'self'時使用的實例變量未設(shè)置為'[(super或self)init ...]的結(jié)果蜜托。
分析:改成如下即可:
self = [super initWithFrame:frame];
if (self) {
}
二抄囚、Dead store(未使用的變量)
1、Value stored to 'xxx' is never read
解釋:永遠(yuǎn)不會讀取存儲到'xxx'的值橄务。
分析:變量沒有被使用幔托,刪除或注釋掉即可静暂。
2扒磁、Value stored to 'xxx' during its initialization is never read
解釋:永遠(yuǎn)不會讀取在初始化期間存儲到'xxx'的值。
分析:也就是說這個model
你申請了兩塊內(nèi)存,導(dǎo)致其中一塊內(nèi)存沒有被使用鲫寄。即去掉初始化方法,直接賦值即可悦屏,如下:
ACMediaModel *model = _mediaArray[indexPath.row];
三绽族、Memory error(內(nèi)存錯誤)
1、nil passed to a callee that requires a non-null 1st parameter
解釋:nil傳遞給需要第一個參數(shù)非null的被調(diào)用者史煎。
分析:代碼中這里的plistPath
是這樣初始化的:NSString *plistPath;
且下面只有if
判斷谦屑,沒有else
,這會導(dǎo)致參數(shù)可能為空篇梭,最好給一個初始值或者使用if
氢橙、else if
、else
判斷很洋。我們再來看一下Xcode里顯示的分析過程:
false
,就會出現(xiàn)上述的錯誤喉磁,所以說這是有潛在的隱患的谓苟。
2、nil returned from a method that is expected to return a non-null value
解釋:方法需要返回一個非空值协怒,即在不改返回空的地方返回空涝焙。
分析:這里是在cellForRowAtIndexPath
方面里,只有else if
判斷沒有 else
判斷孕暇,這可能會導(dǎo)致cell為空仑撞,最好把else if
改成 else
。
四妖滔、Memory(Core Foundation/Objective-C)(CF/OC內(nèi)存)
1隧哮、Potential leak of an object stored into ‘xx’
我們可以具體看一下Xcode的提示信息:解釋:存在xx中的對象有潛在的泄漏。
分析:這里的String
類型轉(zhuǎn)CFString
類型有問題座舍,應(yīng)當(dāng)在最后對string1
進(jìn)行一次CFRelease
沮翔,或者使用如下方法轉(zhuǎn)換:
CFStringRef string1 = (__bridge CFStringRef)str;
CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, string1);
2、Incorrect decrement of the reference count of an object that is not owned at this point by the caller
解釋:調(diào)用者此時不擁有的對象的引用計數(shù)的不正確的減少曲秉;引用計數(shù)問題采蚀。
分析:例如在上面的場景中,使用橋接之后承二,如果還在最后對string1
調(diào)用CFRelease
方法就會出現(xiàn)上述錯誤榆鼠,由于__bridge
用于Objective-C
和Core Foundation
指針之間的轉(zhuǎn)換,這種轉(zhuǎn)換不會更換對象的所有權(quán)亥鸠,所以無需使用調(diào)用CFRelease
方法妆够。
3、Potential leak of an object of type xx
解釋:xx類型的對象存在潛在的泄漏。
五责静、Logic error(邏輯錯誤)
1袁滥、Property of mutable type 'xxx' has 'copy' attribute; an immutable object will be stored instead
解釋:對可變類型使用copy修飾,將存儲不可變對象灾螃。
分析:對可變對象使用copy修飾的時候题翻,可變對象將變成不可變對象。雖然編譯不會報錯腰鬼,但是如果對其進(jìn)行可變的相關(guān)操作就會造成crash嵌赠。
2、Converting a pointer value of type 'NSNumber *' to a primitive boolean value; instead, either compare the pointer to nil or call -boolValue
解釋:將類型為“NSNumber *”的指針值轉(zhuǎn)換為原始布爾值熄赡;相反姜挺,要么將指針與nil進(jìn)行比較,要么調(diào)用-boolValue彼硫。
分析:使用NSNumber作為判斷條件的時候沒有指定類型炊豪,編譯器不知道怎么判斷;將這個值與nil比較拧篮。
3词渤、function call argument is an uninitialized value
解釋:函數(shù)調(diào)用參數(shù)是未初始化的值。
分析:給textSize
一個初始值串绩,如下:
CGSize textSize = CGSizeZero;
4缺虐、The right operand of '-' is a garbage value
解釋: '-'的右操作數(shù)是垃圾值。
分析:同上礁凡,給textSize
一個初始值高氮。
六、API Misuse(Apple)(API調(diào)用錯誤)
1顷牌、Argument to 'NSMutableArray' method 'addObject:' cannot be nil
解釋:'NSMutableArray'方法'addObject:'的參數(shù)不能為空剪芍。
分析:最好給參數(shù)一個初始值或者默認(rèn)值,同時在設(shè)置的時候做一個防空的判斷窟蓝。
2紊浩、Dictionary value cannot be nil
解釋:字典里的值不能為空。
分析:同上疗锐。