Есть ли какая-либо опасность при выходе из отчетов NSLog при создании приложения для распространения?
По какой-то причине во время моего цикла разработки я обнаружил, что я удаляю инструкции NSLog, которые я вставил, чтобы помочь в отладке. Я действительно не знаю, почему у меня такая привычка, я просто делаю это.
Иногда, во время разработки, я обнаруживаю, что у меня возникнет проблема, с которой я столкнулся раньше, а затем завершу повторное добавление старой инструкции NSLog. И затем удалив его позже.
Есть ли веские причины для удаления инструкций NSLog? Из моего опыта, оставив один или два в не вызвало отказ от приложения. И поскольку, насколько мне известно, они ничего не регистрируют, когда приложение находится в дистрибутиве (пожалуйста, поправьте меня, если я ошибаюсь в этом), похоже, что они ничего не навредят. Есть ли поражение в производительности, о котором я должен беспокоиться?
Ответы
Ответ 1
Что я делаю, это добавить макрос, который выполняет ведение журнала, только когда я работаю в режиме отладки. Поместите это в свой <APP_NAME>_Prefix.pch
файл
#ifdef DEBUG
#define DebugLog( s, ... ) NSLog( @"<%p %@:%d (%@)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, NSStringFromSelector(_cmd), [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DebugLog( s, ... )
#endif
В качестве бонуса к регулярному журналу вы получаете имя файла, имя метода и номер строки.
Затем в информации о проекте добавьте это только в сборку отладки. Он находится в разделах User-defined
в разделе GCC_PREPROCESSOR_DEFINITIONS:
DEBUG
Затем замените любой из NSLog, который у вас есть в вашем проекте, с DebugLog (он принимает те же аргументы, что и NSLog), и вам не придется беспокоиться о том, чтобы выпустить операторы отладки в прямом эфире.
В ответ на ваш вопрос регистрация может замедлить производительность приложения, и если вы не потребуете от них помощи в отладке в дикой природе, я бы оставил их.
Ответ 2
Там есть (imo) хороший пост об этом с возможным возможным решением.
Ответ 3
Если у вас большое количество журналов, ваше приложение может быть медленнее. Войдите в консоль, чтобы обработка.
Завершение ответов дает, вот одна большая коллекция констант отладки, которые мы используем. Наслаждайтесь.
// Uncomment the defitions to show additional info.
// #define DEBUG
// #define DEBUGWHERE_SHOWFULLINFO
// #define DEBUG_SHOWLINES
// #define DEBUG_SHOWFULLPATH
// #define DEBUG_SHOWSEPARATORS
// #define DEBUG_SHOWFULLINFO
// Definition of DEBUG functions. Only work if DEBUG is defined.
#ifdef DEBUG
#define debug_separator() NSLog( @"────────────────────────────────────────────────────────────────────────────" );
#ifdef DEBUG_SHOWSEPARATORS
#define debug_showSeparators() debug_separator();
#else
#define debug_showSeparators()
#endif
/// /// /// ////// /////
#ifdef DEBUG_SHOWFULLPATH
#define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,__FILE__,__FUNCTION__); debug_showSeparators();
#else
#define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,[ [ [ [NSString alloc] initWithBytes:__FILE__ length:strlen(__FILE__) encoding:NSUTF8StringEncoding] lastPathComponent] UTF8String ] ,__FUNCTION__); debug_showSeparators();
#endif
/// /// /// ////// /////
#define debugExt(args,...) debug_separator(); debug_whereFull(); NSLog( args, ##__VA_ARGS__); debug_separator();
/// /// /// ////// ///// Debug Print Macros
#ifdef DEBUG_SHOWFULLINFO
#define debug(args,...) debugExt(args, ##__VA_ARGS__);
#else
#ifdef DEBUG_SHOWLINES
#define debug(args,...) debug_showSeparators(); NSLog([ NSString stringWithFormat:@"Line:%d : %@", __LINE__, args ], ##__VA_ARGS__); debug_showSeparators();
#else
#define debug(args,...) debug_showSeparators(); NSLog(args, ##__VA_ARGS__); debug_showSeparators();
#endif
#endif
/// /// /// ////// ///// Debug Specific Types
#define debug_object( arg ) debug( @"Object: %@", arg );
#define debug_int( arg ) debug( @"integer: %i", arg );
#define debug_float( arg ) debug( @"float: %f", arg );
#define debug_rect( arg ) debug( @"CGRect ( %f, %f, %f, %f)", arg.origin.x, arg.origin.y, arg.size.width, arg.size.height );
#define debug_point( arg ) debug( @"CGPoint ( %f, %f )", arg.x, arg.y );
#define debug_bool( arg ) debug( @"Boolean: %@", ( arg == YES ? @"YES" : @"NO" ) );
/// /// /// ////// ///// Debug Where Macros
#ifdef DEBUGWHERE_SHOWFULLINFO
#define debug_where() debug_whereFull();
#else
#define debug_where() debug(@"%s",__FUNCTION__);
#endif
#define debug_where_separators() debug_separator(); debug_where(); debug_separator();
/// /// /// ////// /////
#else
#define debug(args,...)
#define debug_separator()
#define debug_where()
#define debug_where_separators()
#define debug_whereFull()
#define debugExt(args,...)
#define debug_object( arg )
#define debug_int( arg )
#define debug_rect( arg )
#define debug_bool( arg )
#define debug_point( arg )
#define debug_float( arg )
#endif