2013-04-17 116 views
2

是否有可能禁止使用NSLog,這樣它會在編譯時使用時出現錯誤? 理想情況下,某種編譯器標誌與不允許的方法的名稱?不允許使用NSLog

感謝

+3

出於好奇,爲什麼? –

+0

@TRedman - 我正在讀「學習核心音頻」一書 - 這是一個腳註,表示作者無法弄清楚爲什麼他的代碼沒有運行,他剔除了NSLog,發現代碼正常工作,結果證明這是一個速度問題。 – Chris

+0

這個問題很有趣,但書的作者應該試着在他的代碼中找到一個實際的問題。比如像這樣搞比較:'BOOL byes = YES; NSLog(@「%@」,(byes = NO)?@「N」:@「Y」);' - 注意在NSLog之後沒有比較運算符和'byes''NO'。 –

回答

11

如果重新申報NSLog(或許也是NSLogv)作爲

void NSLog(NSString *format, ...) UNAVAILABLE_ATTRIBUTE; 
void NSLogv(NSString *format, va_list args) UNAVAILABLE_ATTRIBUTE; 
在預編譯頭文件

,你會得到一個不錯的錯誤信息:

 
main.m:199:3: error: 'NSLog' is unavailable 
       NSLog(@"%@", s1); 
       ^

你甚至可以提供自定義錯誤信息(在Clang文檔的Messages on deprecated and unavailable Attributes中找到):

void NSLog(NSString *format, ...) __attribute__((unavailable("You should not do this!"))); 
 

main.m:202:3: error: 'NSLog' is unavailable: You should not do this! 
       NSLog(@"%@", s1); 
       ^
+0

我想給我的代碼的用戶一個理由,爲什麼我已經這樣做了,是否有無論如何我可以這樣做,或者我應該只在這條線上面加註釋? – Chris

+1

@Chris:查看更新後的答案。 –

+0

馬丁感謝,這是優秀的! – Chris

2

在您的前綴頭:

#define NSLog(x, ...) (__please_dont_use_NSLog__) 
1

試試這個!

#ifdef DEBUG 
# define NSLog(...) NSLog(__VA_ARGS__) 
#else 
# define NSLog(...) 
#endif 

該解決方案可以在這裏找到:Enable and Disable NSLog in DEBUG mode

希望這有助於!

+0

如果使用NSLog,則不會產生錯誤,它只會使NSLog輸出無效。 –