2013-04-17 69 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输出无效。 –