0

我收到 myArray 隐藏实例变量的错误。请简要解释错误的含义以及如何修复它。谢谢你的帮助。我是 Objective-c 编程的新手

- (IBAction)buttonPushed:(id)sender
{
    NSArray *snarkyCommentArray = [[NSArray alloc] initWithObjects: @"Butter",@"Cheese",@"Gravy",@"Your fat",@"smells like roses",nil];


    self.snarkOffLabel.text = [snarkyCommentArray objectAtIndex:(1)];

}
@end
4

4 回答 4

0

虽然代码与您的问题不符,但我仍然可以解释错误消息。

如果您的类定义了一个实例变量,然后您创建了一个同名的局部变量,编译器会警告您将使用局部变量而不是实例变量。局部变量“隐藏”了实例变量。

最好确保您永远不要为局部变量赋予与实例变量相同的名称,以避免任何混淆。一种常见的做法是给所有实例变量一个下划线前缀,例如_myArray. 这样,每当您阅读代码时,非常明显哪些变量是实例变量,哪些不是。

避免该问题的另一种方法是通过self指针引用实例变量。

假设我的类有一个名为的实例变量foo,而我有一个名为 的局部变量foo

foo = 5; // local variable
self->foo = 10; // instance variable
于 2012-11-16T04:09:18.067 回答
0

我可以说,您的 ivar 和局部变量具有相同的名称。因此,您需要更改其中任何一个的名称。或使用箭头运算符访问您的 ivar。

于 2012-11-16T04:11:14.053 回答
0

考虑以下:

@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;
}

在前面的示例中,numresult都是局部变量。方法是他们的square:整个宇宙。它们不能从外部访问,一旦返回square:它们也不存在。square:据说它们具有局部范围。

那么当一个实例变量和一个局部变量被赋予相同的名字时会发生什么呢?这一切都归结为范围。就作用域而言,局部变量胜过实例变量,因此在决定使用哪个变量时,编译器将使用局部变量。这就是编译器产生警告而不是错误的原因。正在发生的事情是完全可以接受的,但警告程序员仍然是个好主意。

于 2012-11-16T04:51:13.600 回答
0

你试过检查哪里出错了NSLog吗?你知道是否snarkyCommentArray保留你的琴弦吗?检查它像

Nslog(@"snarkyCommentArray %@",snarkyCommentArray);

如果它保留所有,那么关心你的标签,你可以使用它而不self喜欢

snarkOffLabel.text = [snarkyCommentArray objectAtIndex:(1)];

如果它仍然不起作用,则分配您的数组NSMutableArray,例如

NSMutableArray *snarkyCommentArray = [[NSMutableArray alloc] initWithObjects: @"Butter",@"Cheese",@"Gravy",@"Your fat",@"smells like roses",nil];

希望能帮助到你。

于 2012-11-16T07:32:31.863 回答