CocoaLumberjack日志应用程序崩溃

时间:2014-02-27 16:43:32

标签: ios objective-c cocoa-touch lumberjack

首先,我一直在阅读有关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 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分:6)

在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 vs NSCAssert

答案 2 :(得分:2)

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