似乎XCode中的默认行为是静默允许重新定义局部变量(如果它们在更深的范围内声明),但抛出错误或警告。例如,XCode会为"重新定义''""如果在完全相同的范围内重新定义:
- (void) doStuff
{
NSString *var = @"Hello World";
NSString *var = @"Goodbye"; // Error on this line
}
同样,如果我有一个名为' var'的ivar,我会尝试重新声明' var'在本地方法中,XCode将为"本地声明' var'隐藏实例变量"当我尝试使用它时:
//MyClass.h
...
@interface MyClass : NSObject
{
NSString *var;
}
...
//MyClass.m
...
- (void) doStuff
{
NSString *var = @"Hello World";
NSLog(@"%@",var); // Warning thrown on this line
}
到目前为止,这是我所期待的。但是,如果在更深的范围内重新定义var
,例如if
块或for
循环,则XCode允许,并且外部声明默默忽略:
NSString *var = @"Hello World";
if (TRUE)
{
int var = 0;
NSLog(@"%d",var); //prints '0', No errors or warnings
}
NSLog(@"%@",var); //prints 'Hello World'
为什么默认允许最后一个示例,但其他两个被捕获?是否有一些选项或标志我可以在XCode中切换,以便在最后一个例子中也会创建错误或警告?如果XCode不能为我抓住它,是否有一些代码我可以编写以确保变量永远不会被重新定义?或者我的责任是确保我不会重复使用我的变量名称?
答案 0 :(得分:3)
在构建设置(至少Xcode 5& 6)中,您可以将隐藏本地变量的警告设置为YES。
答案 1 :(得分:2)
最后一个示例是Objective-C继承自标准C的行为。变量的范围由支撑级别决定。从C的早期开始就是这样。它被称为变量阴影,它实际上非常有用,即使面对系统库中的API更改,代码也能继续工作。
至于为什么允许它,但前面的例子不是,这是Objective-C如何实现实例变量的结果。实例变量基本上被视为每个类方法的局部变量。因此,当您在影响实例变量的函数中声明局部变量时,它会被标记为错误。基本上,第一和第二个案件被视为等同。
要获得这些情况的警告,请将LLVM警告选项隐藏的本地变量设置为是。