你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發調試技巧總結(持續更新中)

iOS開發調試技巧總結(持續更新中)

編輯:IOS開發綜合
  • 對於軟件開發而言,調試是必須學會的技能,重要性不言而喻。對於調試的技能,基本上是可以遷移的,也就是說你以前在其他平台上掌握的很多調試技巧,很多也是可以用在iOS開發中。不同語言、不同IDE、不同平台的調試,有同性也有個性。今天我們就來學習一下iOS開發中的調試技巧,語言暫用為OC,IDE當然是強大的Xcode。首先說明下,Xcode已經為我們調試項目提供了極大的方便。

    【1.普通斷點】

    斷點(Breakpoint)絕對是調試程序的第一大選擇,也是掌握的基礎技能。顧名思義,當程序運行到斷點處時會暫停運行。比如斷點打在11行,那麼程序就會停在11行(注意:程序只運行到了前10行,第11行其實還沒有被執行!!!)。只要在代碼行旁邊點擊,就能添加一個斷點,再次點擊,就能讓斷點不可用(disable了,仍然存在,只是不起作用了)。在某一行創建斷點的快捷鍵是:command+

     

    並能在調試過程中在下方看到參數的值:

     

    【2.條件斷點】

    以上的斷點只是最普通的,我們還能對斷點的屬性進行配置,設置條件,使斷點更加智能化,右鍵斷點進入編輯對話框:

     

    我以一個循環作為測試代碼:

    循環中的代碼每次都要單步執行,可能這並不是我想要的。我想要在i為3的時候中斷程序,進行調試,編寫條件如下:

    設置i==3的條件後,程序就會在該條件時中斷,而不會每次到達該位置都中斷。中斷時輸出如下:

     

     

    同時也可以設置Ignore參數,會忽略前面n次的斷點運行,會在第n+1次中斷。

    調試輸出如下:

     

    同時,還可以查看某個函數被調用的次數,設置Action參數如下,注意要選中Automatically continue after evaluating actions.

    .

     

    輸出結果如下:

     

    【3.異常斷點】

    斷點的功能不限於上面所述。開發iOS知道,如果我們因為異常然後程序crash了,代碼就直接跑到main.m的main函數中去了。為什麼就不能跑到出現異常的代碼中呢???異常斷點就為我們解決該問題,程序就會在異常出現的那行代碼終止。創建異常斷點圖例如下:

     

    如下所示就創建完成了。如果碰到異常crash時,嘗試使用異常斷點吧。

     

    【4.符號斷點Symbolic Breakpoint】

    符號斷點的創建也同異常斷點。一般符號斷點可以在你指定的[類名 方法名]時中斷執行。

     

    配置符號斷點如下:可以當執行到ViewController類的viewDidLoad方法時中斷執行。

     

    如果你的Symbol只寫了一個函數名,那麼就會在出現該函數名的地方就中斷執行。如下,就會在運行到doAnimation的時候中斷。是不是很強大呢?

    .

     

    【5.Analyze分析器】

    Analyze分析器是一種靜態的工具,可以對我們的程序進行分析,找出我們未使用的變量,或一些死存儲。執行Analyze如下:Product-->Analyze. 如下藍色的標記就是靜態分析的結果。

     

     

    當然,我們可以設置在編譯程序的時候同時Analyze,把下列選項設為Yes即可。

     

    【6.Profile檢查器】

    這個工具實在是太NB了,三言兩語說不完,貼張圖,大家感受一下,我會在以後的博客中慢慢講解該工具的使用。同樣在Product-->Profile中打開。

     

    【7.僵屍對象】

    iOS中把那些已經release但還沒完全消失的對象叫做僵屍對象,對已經release的對象再次釋放,就會發生異常。雖然自從使用ARC後,由於對象釋放產生的異常已經大大變少,但偶爾還會出現。開啟僵屍對象模式後,就能快速定位到異常位置。開啟方式如下:Product-->Scheme-->Edit Scheme. 勾選Enable Zombie Objects即可。

     

    【8.lldb命令】

    Xcode中使用llvm編譯器,公認為最好的C、C++、OC、Swift編譯器。而lldb是llvm中的調試器,我們可以使用一些簡單的命令進行調試,我還是把上面的循環代碼作為測試代碼。

     

    斷點調試中,使用po命令、print命令在Console控制台打印出變量信息:

     

    【9.NSLog打印】

    應該說NSLog打印信息是初學者最喜歡的調試手法,也是最簡單的調試,通過打印出的信息查看程序運行的路徑。但是打印出的信息較少,本身NSLog效率較低,有人使用宏做了部分優化,代碼如下:能夠打印出所在類名、所在方法名、詳細時間、行號。

     

    #import "ViewController.h"
    
    #define NSLog(format, ...) do { 
    fprintf(stderr, "<%s : %d> %s
    ", 
    [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], 
    __LINE__, __func__); 
    (NSLog)((format), ##__VA_ARGS__); 
    fprintf(stderr, "-------
    "); 
    } while (0)
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
        for (int i = 0; i < 5; i++) {
            NSLog(@"我的值:%d",i);
        }
    }
    
    @end

    打印結果如下:

     

     

    【10.生命周期方法init,dealloc】

    對於ViewController來說,有兩個生命周期函數我們可以進行重寫,也就是init和dealloc方法。對於某些對象的狀態,我們可以在這兩個方法中查看。尤其是在dealloc中可以看到當ViewController退出的時候某個對象是否release。

     

    - (instancetype)init
    {
        self = [super init];
        if (self) {
            //初始化語句;
        }
        return self;
    }
    
    - (void)dealloc
    {
        //釋放後調用;
    }


     

    【11.查看代碼運行時間】

    有時候我們想要准確的知道某段代碼、某個循環執行的時間,然後分析效率等問題,這個時候就需要執行時間是多少。正好看到網上已經有人做了這個工作,我就直接摘下來了。正好也用了宏的方式計算時間,我們只要在需要計算時間的代碼塊前後寫上TICK,TOCK宏即可。當然,原理也是非常的簡單,也就是使用NSDate計算差值。

     

    #import "ViewController.h"
    
    #define TICK   NSDate *startTime = [NSDate date]
    #define TOCK   NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        TICK;
        for (int i = 0; i < 5; i++) {
            NSLog(@"我的值:%d",i);
        }
        TOCK;
    }
    
    @end
    

    打印結果如下:

     

     

    【12.手機截屏】

    手機截屏也算調試?哈哈。其實也算是開發中的一個小技巧哈。其實大家都會在iPhone上同時按電源鍵+Home鍵截屏,然後使用各種通訊軟件發給其他人,這個略顯不方便。我們來使用Xcode中的方式截屏。當手機接上電腦後,注意要把調試設備選為自己的手機:

    然後選擇Debug-->View Debugging-->Take Screenshot... .然後可以看到手機屏幕已經在你的電腦桌面了。是不是比直接在手機上操作方便多了呢?這樣就可以快速的發給其他開發者、PM等人了。

     

    【13.viewDidLoad不建議寫太多代碼】

    個人建議不要在viewDidLoad方法中寫入太多代碼。尤其是涉及該界面中的動畫的時候,因為執行viewDidLoad方法的時候,界面可能還沒完全加載出來,如果此時把動畫放在viewDidLoad中,可能會造成動畫無法顯示。當然也不建議把耗時的網絡請求和動畫效果都放在viewDidLoad中,界面的阻塞也會造成動畫無法顯示。可以嘗試把動畫放在viewDidAppear,viewWillAppear方法中。對於這類涉及UI的問題,調試也是比較麻煩的。。。

     

    總結,調試不僅僅是我上面提到的技巧,更多的是長年累月積累下來的經驗,只有在自己的開發中不斷的出錯、試錯、調錯、解決錯誤的過程中才能提高自己的編程水平和調試能力。我會繼續更新該篇博客,講解更多的調試技能,希望我們都能在實踐中提高進步。

    1. 上一頁:
    2. 下一頁:
    蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
    Copyright © Ios教程網 All Rights Reserved