2010-11-08 23 views
6

作爲一個新的程序員,我發現了NSlog的魔力,並通過我的代碼使用它。這在調試中非常有用(與NSZombieEnabled一起)。是否有成本使用NSLog寬鬆?

我可以在模擬器上看到一個明確的性能打擊,因爲它打印出所有這些東西。我不認爲我看到任何設備上的這種打擊,但我不確定。

那麼所有的NSLogs都沒有成本?它在設備上使用更多內存嗎?還是編譯器會忽略它們呢,就像我在爲一個設備編譯時做的註釋一樣?

編輯:

下面是我實現的,每建議從rano.

在我App_Prefix.pch文件,我說:

// DLog is almost a drop-in replacement for NSLog 
// DLog(); 
// DLog(@"here"); 
// DLog(@"value: %d", x); 
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead  DLog(@"%@", aStringVariable); 
#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
#else 
# define DLog(...) 
#endif 

// ALog always displays output regardless of the DEBUG setting 
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 

然後在我的Project Info檢查器中,Debug配置,在標題GCC 4.2 - Preprocessing,下,我將值DEBUG添加到名爲Preprocessor Macros.

作品像一個魅力 - DLog輸出時,我建立Debug版本和ALog總是輸出。

+0

另請參見[是否真的不應該在生產代碼上使用NSLog()?](http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use -nslog-on-production-code) – 2010-11-09 00:55:55

回答

7

NSLog肯定比簡單printf價格昂貴但有一點更融入了Objective-C和Cocoa框架。

順便說一下,當你是認真編程,你會發現它是不適合你的大多數需求。看看這個article及其參考資料,瞭解如何以智能方式替換它。

這樣,當編譯器不再有用時(例如,當你釋放你的代碼片段時),你也可以讓編譯器忽略它。一般而言,您可以在計算密集循環/代碼序列時調用日誌函數。

+4

我只是想發佈相同的鏈接。特別是比爾霍林斯評論15值得一看 – 2010-11-08 22:36:39

+0

@fluchtpunkt是的,頭是有用的。儘管我更喜歡短日誌記錄功能,比如'DNSLog',這樣我就可以輕鬆地轉換以前的日誌 – rano 2010-11-08 22:39:40

0

NSLog沒有作爲宏來實現,所以肯定會有成本。量化它並決定它是否重要更難。唯一可行的方法是測量你自己的應用程序。

0

以上答案已過時。你應該簡單地使用CocoaLumberjack遠遠優於NSLog,並提供更多的功能,然後上述答案。