Сбой приложения 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.

Другие вопросы по тегам