我有一段代码,其中包含一些仅在NSAssert
语句中使用的变量。他们检查方法参数的某些前提条件,调试构建更严格地执行。这是一个例子:
NSString *videoCodec = [outputSettings objectForKey:AVVideoCodecKey];
NSNumber *width = [outputSettings objectForKey:AVVideoWidthKey];
NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey];
NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters.");
NSAssert在构建过程中被编译出来,导致编译器发出“未使用的变量”警告。请注意,此警告仅在我执行发布版本时发生。
我知道这种用法是有效且安全的,但是如何让编译器知道它不会产生错误的消息呢?
答案 0 :(得分:3)
我找到了解决方案,当我看到相同的解决方案已经在此库的开发版本中时,我进一步确认了该解决方案。
编译器警告可以在逐个变量的基础上使用“未使用”属性进行静音。 “cdefs.h”,包含在iOS上,应该在OS-X中,包括一个指向here的便利性定义:
#define __unused __attribute__((__unused__))
结果代码如下所示:
__unused NSString *videoCodec = [outputSettings objectForKey:AVVideoCodecKey];
__unused NSNumber *width = [outputSettings objectForKey:AVVideoWidthKey];
__unused NSNumber *height = [outputSettings objectForKey:AVVideoHeightKey];
NSAssert(videoCodec && width && height, @"OutputSettings is missing required parameters.");
或者,如果可以在没有中间变量的情况下重写NSAssert
语句,并且不会失去清晰度,那么这也是可接受的解决方案。
答案 1 :(得分:0)
NSAssert
时, release
解析为空宏,因此如果变量仅用于断言目的,则会收到警告。
您可以将调试块嵌入#ifdef DEBUG
(假设您的DEBUG
配置定义了此宏),以便摆脱警告。
编辑实际上,在发布版本中构建宏时,宏不为空,但它不会使用传递的参数:
#define NSAssert(condition, desc, ...) do {} while (0)