如何在Objective-C中列印日誌記錄

征途LN發表於2014-01-23

在進行IOS程式設計的過程中,中會遇到這樣一個問題:如果在程式碼中寫了很多NSLog()函式,來確定程式的執行程式,當專案越寫越大,因NSLog帶來的末端輸出資訊會越來越多,這是已經很不難分清每個 NSLog函式在程式的那個位置了。因此,如果末端的輸出資訊中包含了這個NSLog()所在的上下文資訊,比如那個檔案中的哪個方法呼叫的,在哪一行等等,這樣就很明瞭了。

其實,C前處理器提供了很多關於當前檔案、行號或者功能資訊的標準巨集。而且,OC中的隱含引數_cmd會給出當前選擇的方法等資訊,如果在你的NSLog()中加入這些資訊,對於你除錯或者錯誤處理一定能提供有益的參考。

下面把最常用的巨集和表示式寫出來說明



上面兩張圖是我從蘋果開發文件上擷取的圖

英文已經講的很詳細了,下面我演示一下上面幾個函式的用法


- (void)viewDidLoad
{
    [super viewDidLoad];
//    [self addAView];
//    [self addAButton];
    
    NSMutableArray * array = [[NSMutableArray alloc]initWithCapacity:0];
    NSLog(@"%s:%d someObject=%@", __func__, __LINE__, array);
    [array addObject:@"iOS"];
    NSLog(@"%s:%d someObject=%@", __func__, __LINE__, array);
}
執行後控制檯列印的結果為:

2014-01-23 15:55:40.814 test[2994:70b] -[ViewController viewDidLoad]:24 someObject=(
)
2014-01-23 15:55:40.815 test[2994:70b] -[ViewController viewDidLoad]:26 someObject=(
    iOS
)

NSLog(@"\n%s",__FILE__);

/Users/****/Desktop/資料夾名稱/test/test/ViewController.m



NSLog(@"\n%@",[[NSStringstringWithUTF8String:__FILE__]lastPathComponent]);

ViewController.m



下面說一下我專案中的使用:

在應用的****-Prefix.pch檔案中有如下程式碼

//這個巨集是得出這段程式碼做對應的.m檔案

#define DEBUG_FILENAME [[[NSString stringWithUTF8String:__FILE__] 

componentsSeparatedByString:@"/"lastObject]


//DEBUG_NEW_FMT(fmt) 這個巨集是得到fmt這個物件所處的在哪個.m檔案下的哪個函式,並處在這個.m檔案的第幾行

#define DEBUG_NEW_FMT(fmt) \

[NSString stringWithFormat:@"%s(%@:%d) %@", \

__FUNCTION__, \

DEBUG_FILENAME, \

__LINE__, \

fmt]



//##__VA_ARGS__ 也是一個巨集(#define Macro(...) __VA_ARGS__),他的作用是支援可變引數,被省略的引數會被擴充套件成空串,作用和上面一樣,只是重新定義了NSLog()

#define DLog(fmt, ...) NSLog(DEBUG_NEW_FMT(fmt), ##__VA_ARGS__)


//列印空日誌,引數0為了消除編譯器的警告

#define DEBUG_LOG_NULL NSLog(DEBUG_NEW_FMT(@""),0)


//列印一個變數

#define DEBUG_LOG_VALUE(x, fmt)  do {  \

DEBUG_LOG(@#x " = " #fmt, x); \

} while(0)



相關文章