在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在代碼中的位置。
以下是我學習時查看的文章,也分享給大家。懂得感恩,懂得尊重它們的勞動成果:
好了,以上就是我想介紹的NSLog有助於開發中定位打印的知識。都是我在接觸到喜歡、再到使用的東西。iOS還有很多很多東西是我們不懂的,甚至是毫無所知的。一步一步來,摸索->學習->實踐->熟練。每一步都很辛苦,堅持下,往前走會是不一樣的風景。