我正在尝试以一种方式向库中添加对新的日志记录和活动跟踪API的支持,以保持库的用户在尚未采用最新操作系统版本(iOS或macOS)的情况下的向后兼容性。我为每个日志级别定义了自定义日志宏,然后对于较旧的操作系统,回退到
新的API要求您将任何非常量、非标量值明确标记为
这是我宏定义的简化版本(仅包括
有没有什么方法可以从回退情况下的
NSLog
。我已经解决了这个问题,但还存在一个问题。新的API要求您将任何非常量、非标量值明确标记为
public
,如果您希望它们显示在日志输出中。这是我的宏调用的样子:UZKLogInfo("Reading file %{public}@ from archive", fileName);
这段代码使用包含os_log
的SDK(例如iOS 10.0或更高版本)编译没有问题,但是当我使用早期版本编译时,我的宏将退回到NSLog
,就会收到编译器警告:
在
os_log()/os_trace()
之外使用“public”格式说明符注释
并且打印的日志行如下:
Reading file <decode: missing data> from archive
这是我宏定义的简化版本(仅包括
info
定义并简化条件语句):#if UNIFIED_LOGGING_SUPPORTED
@import os.log;
#define UZKLogInfo(format, ...) os_log_info(OS_LOG_DEFAULT, format, ##__VA_ARGS__);
#else // Fall back to regular NSLog
#define UZKLogInfo(format, ...) NSLog(@format, ##__VA_ARGS__);
#endif
有没有什么方法可以从回退情况下的
format
中去掉"{public}"文本(一种字符串替换?)?或者还有其他方法可以支持旧API和新API而不放弃日志中一直显示的信息级别?根据去年关于这个主题的WWDC会议,我需要使用一个宏,否则我将失去调用站点元数据。
NSString
提供的方法吗? - CRDNSString
,而是从源文件中放入宏的文本 - 它在内存中并没有被分配成一个对象。我不确定预处理器有哪些工具可用,但我认为我无法利用NSString
上的方法。 - Dov@format
是一个NSString
,不管这个字符串是程序生成的还是字面量,它仍然是一个NSString
。你可能无法在编译期间修改字符串,但可以在运行时进行更改。你的宏包括对NSLog
的调用,它可以包括一个方法调用。 - CRDNSString
替换可能可行。 - Dov.myExt
,并在Xcode中为.myExt
添加构建规则。然后,构建规则将.myExt
处理成.m
,删除不需要的{public}
出现,编译器再处理.m
。构建规则是一个脚本,可以调用任何命令行应用程序等来完成其工作。Apple有(曾经有过?)一个示例,使用Ruby脚本预处理字符串文件,您可能可以进行适应。或者您可以在宏中包含NSString
方法,运行时成本可能微不足道。 - CRD