iOS開發- 日誌列印(常見)
Q:如何列印當前的函數和行號?
A:我們可以在列印時使用一些先行編譯宏作為列印參數,來列印當前的函數和行號。如:
NSLog(@"%s:%d obj=%@", __func__, __LINE__, obj);
NSLog(@"%s:%d obj=%@", __func__, __LINE__, self); //輸出樣式: //2015-01-06 17:13:17.852 justTest[15079:613] // -[ViewController viewDidLoad]:38 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)到一個檔案將會使他們列印日誌到一個檔案中。
freopen("/tmp/log.txt", "a+", stdout);freopen("/tmp/log.txt", "a+", stderr);