2013-04-17 2 views
2

Можно ли запретить использование NSLog, чтобы он появился как ошибка, если используется во время компиляции? В идеале какой-то флаг компилятора с именем метода, который запрещен?Disallow NSLog для использования

Благодаря

+3

Из любопытства, почему? –

+0

@TRedman - Я читаю книгу «Learning Core Audio» - Theres примечание, в котором говорится, что автор не смог понять, почему его код не работал, он заново запустил NSLog и нашел, что код работал, оказалось это была проблема скорости. – Chris

+0

Вопрос интересный, но автор книги должен был попытаться найти актуальную проблему в своем коде. Например, сопоставление возиться следующим образом: 'BOOL byes = YES; NSLog (@ "% @", (byes = NO)? @ "N": @ "Y"); '- обратите внимание, что нет никакого оператора сравнения, а' byes' - 'NO' после этого NSLog. –

ответ

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); 
       ^

Вы можете даже предоставить собственное сообщение об ошибке (найдено в Messages on deprecated and unavailable Attributes документации Clang):

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

@ Крис: см. Обновленный ответ. –

+0

Martin Спасибо, это отлично !!! – 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. –