iOS ---不一樣的NSLog打印(精准打印)


  在iOS開發過程中,調試是很重要的過程,而除了各種斷點調試(普通斷點、條件斷點、全局斷點)之外,似乎NSLog是我們調試最常用的方法,當然,也是最簡單朴素的尋debug方法。

  在項目中,我們常使用的NSLog的語句無外乎以下一種:  

 NSLog(@"打印字符串:%@",name); NSLog(@"打印整形:%i",number);//或者 %li ; %ld ; %d
 NSLog(@"打印字符:%c",c); NSLog(@"打印單浮點數:%f",f); NSLog(@"打印精度浮點數:%.2f",f); NSLog(@"BOOL--b-->%@",isYES?@"YES":@"NO");//打印布爾類型

  但這樣並不是我們想要的結果,因為打印出來的結果,有時我們並不知道它打印的具體位置,甚至於具體信息。打個比方吧,我們經常會遇到的數組越界、網絡請求數據為空等等。

  我們試一下看看:創建一個空數組-->dataArray,卻打印數組的第三個元素。打印結果如下圖:  

  從上圖中我們可以看出,一個標准的數組越界,但我們看得出來,debug輸出只是說又一個數組越界報錯了,但並沒有指出是哪個數組,數組在哪個位置。。。試想:如果我們在一個ViewController中有幾個數組,這時數組出現越界。就會很難找出到底哪個數組出現debug。那么問題就出現了,怎樣才能使用NSLog還能確定位置呢。   下面正式開始要說的話題:不一樣的NSLog打印

  要使用不一樣的NSlog,首先要了解 以下:預處理器在C/C++/objective-C語言提供的宏

 

  C/C++/Objective-C中用於日志輸出的預處理宏.

Macro Format Specifier Description
__func__ %s 當前函數前面
__LINE__ %d 源碼文件中的行號
__FILE__ %s 源碼文件完整路徑
__PRETTY_FUNCTION__ %s 和__func__類似, 但是在 C++ 代碼中包含更多的信息.

  Objective-C中用於日志輸出的表達式

Expression Format Specifier Description
NSStringFromSelector(_cmd) %@ 當前選擇器的名字
NSStringFromClass([self class]) %@ 當前對象類的名字
[[NSString stringWithUTF8String:__FILE__] lastPathComponent] %@ 源碼文件的名稱

 

[NSThread callStackSymbols]

 

%@

 

 

當前棧信息的刻度字符串數組。僅用於調試,不用向終端用戶展示或者在代碼中用作任何邏輯。

 

 

     *   __func__%s 當前函數簽名

     *   __LINE__ %d 在源代碼文件中當前所在行數  ---->宏在預編譯時會替換成當前的行號

 

     *   __FILE__ %s 當前源代碼文件全路徑   -->宏在預編譯時會替換成當前的源文件名

     *   __PRETTY_FUNCTION__ %s 像 __func__,但是包含了C++代碼中的隱形類型信息。 ---->宏在預編譯時會替換成當前的函數名稱

 

  而關於Log,打印當前函數無非就是_cmd, __func__, __FUNCTION__, PRETTY_FUNCTION。

 1、打印當前的函數名,以及當前代碼所在文件中得行數  

NSLog(@"%s, %d", __FUNCTION__, __LINE__);//直接定位到debug的函數名,以及當前代碼所在文件中得行數。

 

  在- (void)viewDidLoad中輸入以下代碼。。。

  打印結果如下:

 

 2、打印當前的函數名, NSStringFromSelector 獲得參數的選擇器所代表的方法的字符串

 NSLog(@"%@", NSStringFromSelector(_cmd));

打印結果如下:

3、打印當前源代碼文件全路徑 

NSLog(@"%s", __FILE__);

 

  打印結果如下:

     

4、使用__PRETTY_FUNCTION__

上面介紹過:像 __func__,但是包含了C++代碼中的隱形類型信息。

NSLog(@"%s", __PRETTY_FUNCTION__);

 打印結果:

 

 在Xcode中 :

     _cmd會返回一個SEL對象,而剩下的都是來自C/C++編譯器的定義所以都會返回一個C的字符串,顯示結果也都差不多,可能不同編譯器會有小小的差別。

         顯然后面__func__系列要比_cmd好用,相對Objective-C類型內的方法調用,他不僅會顯示方法名,還會顯示類型,配合__LINE__,可以精確定位出Log在代碼中的位置。

以下是我學習時查看的文章,也分享給大家。懂得感恩,懂得尊重它們的勞動成果:

iOS/Cocoa: 使用代碼定位性更高的Log

iOS各種調試技巧豪華套餐

 

好了,以上就是我想介紹的NSLog有助於開發中定位打印的知識。都是我在接觸到喜歡、再到使用的東西。iOS還有很多很多東西是我們不懂的,甚至是毫無所知的。一步一步來,摸索->學習->實踐->熟練。每一步都很辛苦,堅持下,往前走會是不一樣的風景。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM