我完全理解为什么会出现未使用的变量警告。一般来说,我不想压制它们,因为它们在大多数情况下非常有用。但是,请考虑以下(人为的)代码。

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode 报告称 saved 是一个未使用的变量,当然它不是。我怀疑这是因为 NSAssert1 是一个宏。这 NS_BLOCK_ASSERTIONS 宏是 不是 已定义,因此 Objective C 断言肯定是启用的。

虽然它不会伤害任何东西,但我觉得它又乱又烦人,我想抑制它,但我不知道该怎么做。将变量分配给自身可以消除编译器警告,但如果存在这种情况,我宁愿以“正确”的方式进行操作。

有帮助吗?

解决方案

我不确定新的 LLVM 编译器是否仍然支持它,但 GCC 有一个“未使用”属性,您可以使用它来抑制该警告:

BOOL saved __attribute__((unused)) = [moc save:&error];

或者(如果 LLVM 不支持上述内容),您可以将变量声明拆分为单独的行,保证无论宏是否展开,该变量都会被“使用”:

BOOL saved = NO;
saved = [moc save:&error];

其他提示

使用Xcode 4.3.2并发现这似乎有效(少写)

BOOL saved __unused;

在XCode中,您可以为“未使用变量”设置警告。转到目标的“构建设置”,并用“未使用”一词过滤

这是一个屏幕截图: Builld Settings Screenshot

我建议你只为调试更改它。这样您就不会错过发布版本中的任何内容。

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

尝试这样。它对我有用。它也会对你有用。

将变量标记为已使用的唯一简单且可移植的方法是……使用它。

BOOL saved = ...;
(void)saved; // now used

不过,您可能会对已经描述的特定于编译器的扩展感到满意。

尝试:__未使用的属性。适用于 Xcode 5

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

来源

您可以设置“否” LLVM 编译器 2.0 警告 关于“释放” enter image description here

这是 C 语言中的方式,因此 Objective-C 中也是如此。

即使您没有启用警告,将返回值标记为显式忽略始终是一个好主意。它还向其他开发人员表明,您不仅仅是忘记了返回值 - 您确实明确选择了忽略它。

(void)[moc save:&error];

编辑:编译器忽略强制转换 void, ,所以它不应该影响性能——它只是一个干净的人工注释。

让它占据两行。将声明和默认值分开

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top