2010-02-05 63 views
7

我剛剛提交我的第一個iPhone應用程序。可以使用NSLog語句提交iPhone應用程序二進制文件嗎?

我已經放了很多NSLog語句來測試和調試應用程序。

所以我的問題是「是否可以保持的NSLog聲明在源代碼」

,我有一個疑問,NSLog的聲明是否會減慢總執行時間或沒有。

謝謝。

+1

查看http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code – Vladimir 2010-02-05 14:19:22

回答

9

我用這一切的時候(發現它的地方):

// DLog is almost a drop-in replacement for NSLog to turn off logging for release build 
// 
// add -DDEBUG to OTHER_CFLAGS in the build user defined settings 
// 
// Usage: 
// 
// 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(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) do {} while (0) 
#endif 
// ALog always displays output regardless of the DEBUG setting 
#define ALog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 

的three20項目從Facebook已經調試或日誌記錄更復雜的方式。

+0

你能告訴你在哪裏找到它嗎,所以我可以更好地理解它 – harshalb 2010-02-06 08:54:17

+0

對不起。我忘了它在哪裏。 但是,源代碼足夠描述。你可以谷歌它。如果我能找到它,你可以。 – 2010-02-06 16:27:46

+1

這是從這個博客 - http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog – deanWombourne 2010-02-08 09:40:47

3

的三個應用程序我已經在AppStore上都裝有NSLogs所以我想這沒關係......

2

我從來沒有擺脫雷:)

有人建議有條件的編譯器/編譯器宏所以你可以在沒有任何NSLog的情況下進行構建,但是我認爲這樣做很費力,而且獎勵很少。但是,NSLog確實會減慢應用程序的運行速度(略),所以我會刪除任何直接影響性能的應用程序。此外,您可能要刪除一些調試日誌信息隱藏你如何執行你的應用程序等

希望這是有幫助的,

山姆

+0

好的答案,但我不確定「我認爲這樣付出的回報太少了。」一旦你完成了這個工作,當你建立一個新項目時,再次實施並不困難(最多需要5分鐘)。我個人有一個DebugLog定義,有條件地編譯爲發佈版本,沒有任何內容,讓我使用NSLog用於真正重要的東西,我想在日誌中顯示。 – Kevin 2010-02-05 14:50:13

+0

根據NSLog的數量和內容,減速可能會相當大。如果您在表格中記錄每個對象的描述,您可能會看到較差的滾動性能。 – FelixLam 2010-02-05 15:01:33

+0

@KevinBlair - 非常真實,但我必須編寫宏,然後我所在的團隊都需要採用宏 - 我走的是阻力最小的路徑:)(如果有的話,每個新項目都內置一個預先定義的宏) – deanWombourne 2010-02-05 15:55:09

6

的應用我工作perviously了許多NSLogs傾銷調試到控制檯。我們發現它們嚴重阻礙了iPhone 3G的性能。在3GS上,性能受到顯着影響,但並不如此。

我的建議是使用預處理器宏和調試預處理器定義在調試版本中有條件地使用NSLog,但在發佈版本中不使用。

1

我只是使用「useDebugMode」singleton int設置爲0或1,存儲在userPrefs(plist)中。並且,根據iPhone的UUID,我添加一個「使用調試模式:開/關」切換到設置屏幕,以便我可以使用生產版本調試未來的問題。這讓我可以調試數據問題(使用下載的XML),如果有人抱怨未來該計劃的問題。然後我用所有「的NSLog」 S和「printf的」 S在

if (useDebugLog == 1) 
{ 
    NSLog(@"debug statement"); 
} 

這對我的作品......當然,:

if (useDebugLog == 1) 

導致一些開銷我願意處理。

0

它不是在Release中使用NSLog的問題。但是,如果您將任何有價值的數據放在日誌中,其他用戶(開發人員)可以看到該數據像一些下載鏈接等。

2

XCode4提供了一個非常簡潔的解決方案 - 使用斷點。 選擇操作'記錄消息'並設置val = @ val @作爲消息, 然後勾選'評估操作後自動繼續'框。

不適合每個使用案例,但它可以讓您輕鬆檢查值的「 」,並保證它們不會成爲發行版。

+0

似乎很好的一個。謝謝 。 – harshalb 2011-07-18 11:09:24

相關問題