iOS開發 Xcode使用Analyze靜態分析
一.Analyze簡介:
我們可以使用Xcode自帶的靜態分析工具 Product->Analyze(快捷鍵command+shift+B)可以找出程式碼潛在錯誤,如記憶體洩露,未使用函式和變數,迴圈引用等
所謂靜態記憶體分析, 是指在程式沒執行的時候, 通過工具對程式碼直接進行分析
根據程式碼的上下文的語法結構, 讓編譯器分析記憶體情況, 檢查是否有記憶體洩露
二.Analyze主要分析以下幾種問題:
- 1、邏輯錯誤:訪問空指標或未初始化的變數等;
- 2、記憶體管理錯誤:如記憶體洩漏等; 比如ARC下,記憶體管理不包括core foundation
- 3、宣告錯誤:從未使用過的變數;
- 4、Api呼叫錯誤:未包含使用的庫和框架。
缺點: 靜態記憶體分析由於是編譯器根據程式碼進行的判斷, 做出的判斷不一定會準確, 因此如果遇到提示, 應該去結合程式碼上文檢查一下
1.面向使用者的文字應該使用本地化(User-facing text should use localized string macro):
解決辦法:
在專案中TARGETS -> Build Settings -> Missing Localizability 將Missing Localizability設定成NO
2.從未使用過的變數(Value stored to ‘***’ during its initialization is never read):
解決辦法:
把未使用的變數刪除
3.instance variable used while 'self' is not set to the result of '[(super or self) init...]
解決辦法:
- (instancetype)init
{
if (self == [super init]) {
//
}
return self;
}
改成:
- (instancetype)init { if (self = [super init]) { // } return self; }
4.方法返回空(Null is returned from a method that is expected to return a non-null value)
解決辦法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView == self.selectedContentTableView) {
// make cell...
return cell;
}
else if(tableView == self.recipientTableView) {
// make cell...
return cell;
}
else {
NSLog(@"Some exception message for unexpected tableView");
return nil; // ??? what now instead
}
}
改成:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView == self.selectedContentTableView) {
// make cell...
return cell;
}
else if(tableView == self.recipientTableView) {
// make cell...
return cell;
}
else {
NSLog(@"Some exception message for unexpected tableView");
abort(); //__attribute__((noreturn))
}
}
或者:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView == self.selectedContentTableView) {
// make cell...
return cell;
}
else if(tableView == self.recipientTableView) {
// make cell...
return cell;
}
else {
NSLog(@"Some exception message for unexpected tableView");
return [[UITableViewCell alloc] init];
}
}
5.The 'viewDidAppear:' instance method in UIViewController subclass '*' is missing a [super viewDidAppear:]call
解決辦法:
找到那個UIViewController的方法'viewDidAppear' 加上[super viewDidAppear:animated];