我明白警告说的是什么。这正是范围规则的工作原理。我很欣赏有些人想要一个保姆。我不。如何禁用此警告?
答案 0 :(得分:6)
您无法在当前版本的XCode中禁用此警告。它没有构建设置,也没有警告ID,您可以使用它将标志传递给编译器以告诉它退出抱怨。
为了将来参考,您可以通过转到Log Navigator找到该警告ID,单击出现警告的最新版本,深入查看日志以找到“编译”任务显示的位置感叹号并单击“更多详细信息”按钮,该按钮看起来像一个带有5条水平线的灰色标注。您将看到详细列出的警告/错误,如果有警告ID,它将显示在详细说明黄色警告的行上。至少,这就是我在Apple的一位编译工程师所说的话。我还没有看到一个警告,我实际上要禁用日志中出现ID。
向Apple提交bugreport,告诉他们您需要更多选项来禁用XCode中的警告并专门列出这个警告。
答案 1 :(得分:6)
在Xcode 4.4中,可以通过转到构建设置“Other Warning Flags”并设置值“-Wno-shadow-ivar”来禁用它。
答案 2 :(得分:5)
您正在寻找的警告名称是“shadow-ivar”。它在Xcode 4.3的日志中显示为warning: local declaration of 'foo' hides instance variable [-Wshadow-ivar]
。
我仍然没有在项目的Build Settings列表中看到它,但是#pragma clang diagnostic ignored "-Wshadow-ivar"
将一次在一个文件中处理它。我实际上想为特定功能关闭它然后再打开它。就这样,在我决定不关心的地方,我不再唠叨我,但会在新的代码中再次警告我。
答案 3 :(得分:3)
NSString *foo;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
- (void)myFunctionWithShadow_ivarWarningsIgnored {
NSString *foo = @"...";
NSLog(@"This shouldn't get a warning %@", foo);
}
#pragma clang diagnostic pop
- (void)myFunctionWithShadow_ivarWarningsNotIgnored {
NSString *foo = @"...";
NSLog(@"and this should %@", foo);
}
祝你好运! :)
答案 4 :(得分:1)
Xcode 8.3的更新 - 编译器产生的错误"声明阴影局部变量"在某些情况下,当它故意......和保姆恐慌。
例如,在目标C中:
鉴于
typedef BOOL ( ^BoolBoolBlock ) ( BOOL );
Apple Blocks的性质将使直接外部范围内的任何变量声明为块,块为全局(伪全局)。这会导致BOOL theResult = false;
行上的警告(以及设置中警告==错误的错误):
- (BoolBoolBlock) boolBoolBlock {
BoolBoolBlock theResult = nil;
theResult = ^BOOL ( unused BOOL is ) {
BOOL theResult = false; // hides (shadows) the outer theResult (a good thing)
/*
call back code goes here,
all variables local in scope to this method are global to the block so be careful
*/
return theResult;
};
return theResult;
}
保姆看到BoolBoolBlock theResult = nil;
被BOOL theResult = false;
遮挡阴影,这实际上是故意的,原因有两个: