首先,我一直在阅读有关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'
?
还有其他办法吗?。
答案 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函数。