6

首先,我一直在阅读一些关于 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'?

还有另一种方法可以做到这一点吗?

4

3 回答 3

11

_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 方法。

于 2014-02-27T19:27:13.500 回答
6

在 C 函数中没有 hidden self,也没有 hidden _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__)

类似于NSAssertvsNSCAssert

于 2014-02-27T20:03:00.370 回答
2

是的,您现在应该使用 DDLogC*。在下一个版本(2.0)中,DDLogError 将适用于 Obj-c 方法和 C 函数。

于 2014-03-07T07:56:39.367 回答