Выражение препроцессора Objective-C для журнала отладки

У меня есть такой код:

#define FORCE_DEBUG_MODE [[[NSUserDefaults standardUserDefaults] valueForKey:@"forceDebugMode"] isEqualToString:@"1"]

#if defined DEBUG_MODE || defined FORCE_DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s),  ##__VA_ARGS__] )
#else
#define DLog( s, ... ) 
#endif

Я читал из какой-то статьи снаружи, чтобы использовать маркировку предварительной обработки для определения DEBUG_MODE, однако я хотел бы переопределить режим, если я установил значение NSUserDefaults на что-то.

Этот код не получил ошибок. Но кажется, что независимо от того, что такое FORCE_DEBUG_MODE, defined FORCE_DEBUG_MODE равно true. Я хочу что-то вроде FORCE_DEBUG_MODE == 1

Скажите, пожалуйста, могу ли я это сделать и как?


person mineschan    schedule 02.12.2011    source источник


Ответы (2)


вы определили FORCE_DEBUG_MODE прямо над вашей проверкой, чтобы увидеть, определен ли он. Чтобы проверить, верно ли это, вы должны просто выполнить || FORCE_DEBUG_MODE, однако это также будет всегда верно, поскольку он только видит, есть ли какое-то значение под макросом - все это делается в препроцессоре, что означает, что ни один из этих кодов не будет запущен или reran во время выполнения - эти определения будут определять, какой код фактически скомпилирован, а не какой код запускается

person DanZimm    schedule 02.12.2011
comment
У меня есть секретная страница настроек, которую я хочу включить там. Во всяком случае, чтобы сделать это? - person mineschan; 02.12.2011
comment
Да, поэтому проверьте во время выполнения, установлены ли какие-либо настройки предпочтений или как вы хотите это проверить, а затем во время выполнения решите, следует ли это регистрировать. Обратите внимание, что это означает, что вы должны сделать if (FORCE_DEBUG_MODE) в коде, чтобы он выполнял проверки во время выполнения, чтобы увидеть, должен ли он регистрироваться, а не фактически изменять скомпилированный код. - person DanZimm; 02.12.2011
comment
Я использую этот способ, и все идет просто отлично. Спасибо~ - person mineschan; 19.12.2011

#if defined просто проверяет, было ли определено значение, а не то, что это за значение. Вы можете просто использовать #if, чтобы проверить, определено ли значение для значения, отличного от нуля.

Однако в вашем случае это все равно не сработает. Препроцессор запускается перед компилятором, поэтому его нельзя использовать для переключения кода во время выполнения. Вам необходимо выполнить проверку значения по умолчанию во время выполнения.

person Alex Deem    schedule 02.12.2011
comment
ладно, вполне ясно. Почему я хочу переопределить, моя компания публикует приложение с помощью корпоративной программы для нашего клиента. Мы хотели бы иногда следить за журналом рядом с ними, чтобы обнаружить неожиданное поведение. Но мы не хотим, чтобы другой доступ к журналу (независимо от того, у кого есть Mac с Xcode, может это сделать). Что я могу сделать в этой ситуации? - person mineschan; 02.12.2011