1. 程式人生 > >iOS開發 Xcode使用Analyze靜態分析

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];