考虑以下:
@interface myClass : NSObject{
NSString *name;
}
- (void)print:(NSString*)name;
- (void)printName;
@end
@implementation myClass
- (void)print:(NSString*)name{
// This line will print the local variable 'name', not the instance variable 'name'
// This line will cause a warning to the effect "Local variable hides instance variable"
NSLog(@"%@", name);
}
- (void)print{
// This line will print the instance variable 'name'.
NSLog(@"%@", name);
NSString *name = @"Steve";
// This line will print the local variable 'name'.
// This line will cause a warning to the effect "Local variable hides instance variable"
NSLog(@"%@", name);
}
@end
了解实例变量和局部变量之间的区别很重要。实例变量是在类的“@interface”部分中定义的变量。例子:
@interface myClass : NSObject {
// Instance variables
NSString *name;
float progressAmount;
NSUInteger *age;
}
@end
实例变量可以被类的任何方法访问。局部变量是具有局部作用域的变量,只能在声明它的方法或块中访问。例子:
- (int)square:(int)num{
int result = num * num;
return result;
}
在前面的示例中,num
和result
都是局部变量。方法是他们的square:
整个宇宙。它们不能从外部访问,一旦返回square:
它们也不存在。square:
据说它们具有局部范围。
那么当一个实例变量和一个局部变量被赋予相同的名字时会发生什么呢?这一切都归结为范围。就作用域而言,局部变量胜过实例变量,因此在决定使用哪个变量时,编译器将使用局部变量。这就是编译器产生警告而不是错误的原因。正在发生的事情是完全可以接受的,但警告程序员仍然是个好主意。