我有一段只在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在构建过程中被编译出来,导致编译器发出“未使用的变量”警告。请注意,只有在进行发布构建时才会出现此警告。
我知道这种用法是有效和安全的,但是我如何才能让编译器知道它不会生成错误的消息呢?
发布于 2016-01-18 12:16:08
我找到了解决方案,当我看到相同的解决方案已经在这个库的开发版本中时,我进一步确认了它。
编译器警告可以在具有“未使用”属性的基础上逐个变量地消除。"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语句,并且不会丢失清晰度,这也是一种可接受的解决方案。
发布于 2016-01-18 12:14:55
为release构建时,NSAssert会解析为空宏,因此,如果变量仅用于断言目的,则会收到警告。
您可以将调试块嵌入到#ifdef DEBUG中(假设您的DEBUG配置定义了此宏),以消除警告。
编辑实际上,在release中构建时,宏不为空,但它不使用传递的参数:
#define NSAssert(condition, desc, ...) do {} while (0)https://stackoverflow.com/questions/34847216
复制相似问题