Я привык к программированию и доступ к журнальным сообщениям. Я знаю, что вы использовали NSLog()
для отслеживания сообщений при отладке приложений Cocoa. Каков наилучший способ "отслеживать" сообщения при кодировании в среде разработки iPhone Xcode?
Как мне отлаживать NSLog (@ "Внутри симулятора iPhone" )?
Ответ 1
Там гораздо более удобный способ отслеживать сообщения журнала в Xcode и использовать с помощью действий точки останова.
В строке кода, где у вас возникнет соблазн добавить printf или NSLog, установите точку останова, затем щелкните ее правой кнопкой мыши и выберите "Изменить точку останова". В появившемся голубом пузыре нажмите кнопку + справа, чтобы открыть действия точки останова: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png
Введите там текст журнала. Любое выражение, которое может быть напечатано в отладчике, может использоваться при ограничении знаками @.
Для отладки Objective-C обычно полезно выбрать команду "Отладчик" из всплывающего окна и ввести метод po [[метод объекта]] для печати строки описания объекта Objective-C или результата метода звоните.
Обязательно установите флажок "Продолжить" в правом верхнем углу, чтобы выполнение продолжалось после журнала.
Преимущества этого над NSLog и printf:
- Это на лету. Вам не нужно перекомпилируйте и перезапустите, чтобы добавить или изменить сообщения журнала. Это экономит вам много время.
- Вы можете выборочно включать и отключите их. Если вы учитесь достаточно от одного, но его извержение вмешательство, просто снимите флажок Включено коробка.
- Все выходные данные генерируются на вашем Mac, никогда на iPhone, так что вы не нужно скачивать и анализировать через журналы после факта.
- Возможность доставки пусковой консоли в вашем приложении значительно уменьшилось.
Также проверьте кнопку Speak; это отлично подходит для отладки полноэкранных приложений, где вы не можете увидеть журнал отладки.
Ответ 2
Здесь отличный код, который я нашел где-то в Интернете. Он определяет новые функции DLog() и ALog(). Сообщения DLog появляются только тогда, когда приложение скомпилировано с флагом -DDEBUG (определите DEBUG). Появляются сообщения ALOG ALWAYS (даже в режиме Release).
// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
Ответ 3
В моем проекте у меня есть индивидуальное решение, основанное на DebugOutput.m Это добавляет номер файла и строки в вывод отладки, что делает его легче определить, откуда идет выходной текст, сохраняя при этом краткость.
Я добавил стандартное решение с маской отладки, чтобы я мог включать и отключать отладку для определенных областей функциональности в моем приложении. В Debug.h у меня есть
typedef enum {
kDebugMaskAp- = 1,
kDebugMaskXMLParser = 1 << 1,
kDebugMaskNetwork = 1 << 2,
kDebugMaskAnalytics = 1 << 3,
kDebugMaskCache = 1 << 4,
} debugBitMask;
#define debugForComponent(mask,format,...) if( currentDebugMask() & mask) [[DebugOutput sharedDebug] output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__]
И в Debug.m
-(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ...
{
va_list argList;
NSString *filePath, *formatStr;
// Build the path string
filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding];
// Process arguments, resulting in a format string
va_start(argList, input);
formatStr = [[NSString alloc] initWithFormat:input arguments:argList];
va_end(argList);
// Call NSLog, prepending the filename and line number
NSLog(@"File:%s Line:%d %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr);
[filePath release];
[formatStr release];
}
В приложении вызовы выглядят примерно так:
debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);
Ответ 4
Вставьте это в свой заголовок префикса. ВСЕ журналы из проекта исчезнут наверняка.
#ifndef __OPTIMIZE__
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif
Ответ 5
Вы можете использовать NSLogger, который приносит гораздо больше информации, чем просто запись ваших сообщений. Я использую макросы для отключения журналов в сборках релизов, оставляя каждый из них активным в отладочных сборках. Объем журнала не является проблемой, поскольку NSLogger предлагает мощные параметры фильтрации журналов.
Ответ 6
Я просто использую замену всей функциональности....
Я отключу все мои инструкции NSLog, заменив NSLog (@ "на//*** NSLog (@"
Таким образом, я могу просто найти его (используя find во всех файлах проекта) с // *** NSLog (@"и повторно включить их
Ничего необычного, но он работает:)