[iPhone開發]iOS中日誌打印Q&A

Q:如何打印當前的函數和行號?

A:我們可以在打印時使用一些預編譯宏作爲打印參數,來打印當前的函數和行號。如:

1
NSLog(@"%s:%d obj=%@", __func__, __LINE__, obj);

其中__func__和__LINE__都是預編譯的宏,編譯時會分別替換爲當前函數和當前行號。
下面是一些常用於打印日誌的宏。

說明
__func__ 打印當前函數或方法,c字符串
__LINE__ 打印當前行號,整數
__FILE__ 打印當前文件路徑,c字符串
__PRETTY_FUNCTION__ 打印當前函數或方法(在C++中會包含參數類型),c字符串

Q:如何打印一個類名,消息名,當前堆棧信息?

A:你可以使用以下方法在運行時動態獲取這些信息。

代碼 說明
NSStringFromSelector(SEL) 獲取selector的名字
NSStringFromSelector(_cmd) 獲取當前方法名
NSStringFromClass([object class]) 獲取object的類名
[NSThread callStackSymbols] 獲取當前線程的棧,是一個NSArry,包含堆棧中所有函數名。

Q:如何將日誌打印到一個文件

A:可以使用freopen函數重定向標準輸出和標準出錯文件。因爲printf函數會向標準輸出(stdout)打印,而NSLog函數會向標準出錯(stderr)打印。重新定向標準輸出(stdout)和標準出錯(stderr)到一個文件將會使他們打印日誌到一個文件中。

1
2
freopen("/tmp/log.txt", "a+", stdout);
freopen("/tmp/log.txt", "a+", stderr);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章