ios define NSLog debug 應用發佈nslog註釋 – iPhone手機開發技術文章 iPhone軟體開發教學課程

1 選擇工程的Target -> Build Settings -> Preprocessor Macros.

如圖,默認 Debug項,是“DEBUG=1”.

2 在程序中設置全局宏定義

在程序的 ApplicationName-Prefix.pch 文件中,加入如下,很簡單

#ifdef DEBUG_MODE
#define DLog( s, ... ) NSLog( @" %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DLog( s, ... ) 
#endif

3 這樣就設置好瞭,測試

在任意ViewController.m中寫入

DLog(@"1234");

結果:

2012-07-25 17:09:54.448 xxxx[7094:707]  1234

這樣發佈的時候DLog就不會有輸出瞭。 

在Objective-c開發程序的時候,有專門的日志操作類NSLog,它將指定的輸出,輸出到(stderr),我們可以利用Xcode的日志輸出窗口,那麼既然是要記錄到具體日志文件,我們就想輸出日志寫入到具體的日志文件即可。

代碼
1、 宏定義(下面是我在程序中常用到的日志宏,用DEBUG開關管理,
也就是說隻有在DEBUG模式下才讓日志輸出 :)

#ifdef DEBUG
# define LOG(fmt, …) do { \
NSString* file = [[NSString alloc] initWithFormat:@”%s”, __FILE__]; \
NSLog((@”%@(%d) ” fmt), [file lastPathComponent], __LINE__, ##__VA_ARGS__); \
[file release]; \
} while(0)
# define LOG_METHOD NSLog(@”%s”, __func__)
# define LOG_CMETHOD NSLog(@”%@/%@”, NSStringFromClass([self class]), NSStringFromSelector(_cmd))
# define COUNT(p) NSLog(@”%s(%d): count = %d\n”, __func__, __LINE__, [p retainCount]);
# define LOG_TRACE(x) do {printf x; putchar(‘\n’); fflush(stdout);} while (0)
#else
# define LOG(…)
# define LOG_METHOD
# define LOG_CMETHOD
# define COUNT(p)
# define LOG_TRACE(x)
#endif

可以看到,除瞭標準的用戶定義輸出外,我還加入瞭許多有用的信息,
比如源程序文件位置,行號,類名,函數名等。具體的應用可以在具體的開發過程中添加、刪除。

2、 應用:
– (void)redirectNSLogToDocumentFolder{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,
YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName =[NSString stringWithFormat:@”%@.log”,[NSDate date]];
NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],”a+”,stderr);
}

– (void)applicationDidFinishLaunching:(UIApplication
*)application {
// 真機測試時保存日志
if ([CDeviceInfo getModelType] != SIMULATOR) {
[self redirectNSLogToDocumentFolder];
}
}

真機測試的時候,可以利用freopen將標準錯誤輸出保存到指定的文件當中,
這樣就可以在問題發生後分析日志文件。

3、 設置DEBUG標志是否正確定義

Xcode 一般會在 debug 運行配置項裡面已經定義號瞭DEBUG 標志,如果沒定義我們就自己寫上,以我的 Xcode 4 為例,在項目get Info中找到 PreProcessor Macros 這個屬性,對於
Debug 配置我們給他寫上 DEBUG,而在 Release 配置中把它留空。 這樣我們剛才那段預處理命令就可以根據這個標志來判斷我們編譯的時調試版本還是發佈版本,從而控制 NSLog 的輸出。 (因為 Xcode 4 會把 debug/release 兩個配置項同時對比展現出來,而 3.x 版本的隻能分別設置,如果你用的時xcode 3.x 開發工具, 那麼就分別對 Debug/Release 都檢查一下)。

發佈留言