Сбой приложения CocoaLumberjack Log
Прежде всего, я читал некоторые темы о CocoaLumberjack, и я не смог найти решение этого вопроса:
Я использую CocoaLumberjack для входа в мое приложение. Но я хочу, чтобы войти приложение тоже падает.
Я попробовал это:
void uncaughtExceptionHandler(NSException *exception) {
DDLogError(@"CRASH: %@", exception);
DDLogError(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
// Send log to SOA
}
Но я получаю эту ошибку в appDelegate, в других местах работает хорошо:
Use of undeclared identifier '_cmd'; did you mean 'dcmd'
?
Есть ли другой способ сделать это?
3 ответа
_cmd
является ярлыком для текущего селектора или вызываемого метода Objective-C. Например, в классе, который реализовал такой метод:
@implementation MDAppController
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
NSLog(@"[%@ %@]", NSStringFromClass([self class]),
NSStringFromSelector(_cmd));
}
@end
было бы распечатать:
[MDAppController applicationWillFinishLaunching:]
Вы сталкиваетесь с проблемами, пытаясь использовать DDLogError()
из этого uncaughtExceptionHandler()
функция, потому что это функция C, а не метод Objective-C, так _cmd
не определено
Вы должны использовать DDLogCError()
вместо DDLogError()
, поскольку первый предназначен для использования в функциях C, а не в методах Objective-C.
В функции C нет скрытого self
и не спрятано _cmd
но никогда не бойся...
Для вас есть семейство функций регистрации:
#define DDLogCError(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__)
#define DDLogCWarn(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__)
#define DDLogCInfo(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__)
#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)
похожий на NSAssert
против NSCAssert
Да, вы должны использовать DDLogC* сейчас. В следующей версии (2.0) DDLogError будет работать как для методов Obj-c, так и для функций C.