首先,我一直在阅读一些关于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'
还有别的办法吗?
发布于 2014-02-27 19:27:13
_cmd
是正在调用的当前选择器或Objective方法的快捷方式。例如,在实现如下方法的类中:
@implementation MDAppController
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
NSLog(@"[%@ %@]", NSStringFromClass([self class]),
NSStringFromSelector(_cmd));
}
@end
它会打印出来:
[MDAppController applicationWillFinishLaunching:]
在这个DDLogError()
函数中使用uncaughtExceptionHandler()
会遇到问题,因为它是一个C函数,而不是Objective方法,因此_cmd
是未定义的。
您应该使用DDLogCError()
而不是DDLogError()
,因为前者用于C函数,而不是Objective方法。
发布于 2014-02-27 20:03:00
在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
发布于 2014-03-07 07:56:39
是的,你现在应该使用DDLogC*。在下一个版本(2.0)中,DDLogError将同时适用于Obj方法和C函数。
https://stackoverflow.com/questions/22074836
复制相似问题