NSAssert中使用的变量的未使用变量警告

时间:2016-01-18 04:12:13

标签: ios objective-c xcode

我有一段代码,其中包含一些仅在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在构建过程中被编译出来,导致编译器发出“未使用的变量”警告。请注意,此警告仅在我执行发布版本时发生。

我知道这种用法是有效且安全的,但是如何让编译器知道它不会产生错误的消息呢?

2 个答案:

答案 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)