如何摆脱Xcode中的"未使用的变量"警告?

Gre*_*ley 96 xcode objective-c compiler-warnings unused-variables

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

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

Xcode报告这saved是一个未使用的变量,当然它不是.我怀疑这是因为NSAssert1是一个宏.该NS_BLOCK_ASSERTIONS是宏没有定义,那么目标C断言肯定启用.

虽然它没有伤害任何东西,但我发现它不整洁且烦人,我想压制它,但我不知道该怎么做.将变量分配给自己可以摆脱编译器警告,但如果存在这样的事情,我宁愿以"正确"的方式进行.

She*_*ley 107

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

BOOL saved __attribute__((unused)) = [moc save:&error];
Run Code Online (Sandbox Code Playgroud)

或者(在LLVM不支持上述情况的情况下),您可以将变量声明拆分为单独的行,保证变量将被"使用",无论宏是否扩展:

BOOL saved = NO;
saved = [moc save:&error];
Run Code Online (Sandbox Code Playgroud)


JOM*_*JOM 103

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

BOOL saved __unused;
Run Code Online (Sandbox Code Playgroud)


Bla*_*rog 37

在Xcode中,您可以设置"未使用的变量"的警告.转到目标的"构建设置",并使用"未使用"一词进行过滤

这是一个截图: Builld设置截图

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

  • 你是否错过了格雷戈里所说的"我不想一般地压制它们,因为它们在大多数情况下非常有用"的问题部分? (35认同)
  • 关闭警告是错过错误的好方法.我强烈推荐反对. (9认同)
  • @ShermPendley无论如何,这仍然有用,它回答了我关于如何在全球范围内关闭它的问题. (8认同)
  • @orionelenzil - 嗯,是的,不.误报存在真正的界面问题.如果您没有使用变量的代码部分,则在编写代码时会不断弹出警告.随着时间的推移,这将训练你忽略警告意味着你可能会错过更重要的错误.最好能够抑制正在编辑的代码块中的错误. (2认同)

Dan*_* Xu 21

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

试试这样吧.它对我有用.它也适合你.


use*_*367 14

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

BOOL saved = ...;
(void)saved; // now used
Run Code Online (Sandbox Code Playgroud)

但是,您可能对已经描述的特定于编译器的扩展感到满意.

  • 我比上面描述的丑陋的#pragma更喜欢这个. (2认同)

Ale*_*lex 9

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

资源


Joã*_*nes 8

尝试使用:__ unused属性.适用于Xcode 5


ArN*_*rNo 5

您可以在“发布”上设置“否” LLVM 编译器 2.0 警告在此处输入图片说明


Tre*_*kow 5

这是您在 C 中执行的方式,因此也是 Objective-C。

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

(void)[moc save:&error];
Run Code Online (Sandbox Code Playgroud)

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