【问题标题】:local declaration of variable hides instance variable变量的局部声明隐藏实例变量
【发布时间】:2015-04-14 07:05:18
【问题描述】:

我收到以下错误:

main.m:14:1: warning: local declaration of 'a' hides instance variable                                                                                              
 -(void)setA:(int)a {self.a=a;}                                                                                                                                     
 ^                                                                                                                                                                  
main.m: In function '-[Arithmetic setB:]':                                                                                                                          
main.m:16:1: warning: local declaration of 'b' hides instance variable                                                                                              
 -(void)setB:(int)b {self.b=b;}           

而我的代码如下:

@interface Arithmetic:NSObject{
    int a,b;
}
-(int)a;
-(void)setA:(int)a;
-(int)b;
-(void)setB:(int)b;
-(int)add;
@end

@implementation Arithmetic
-(int)a{
    return  a;
}

-(void)setA:(int)a {
    self.a=a;
}

-(int)b {
    return b;
}

-(void)setB:(int)b {
    self.b=b;
}

-(int)add {
    return [self a]+[self b];
}

@end

【问题讨论】:

  • 这是一个警告,而不是错误。而且很清楚。哪一部分你不明白?
  • 仍然没有得到想要的输出
  • 不是这回答了你的问题,但是你知道如果你刚刚去了@property (nonatomic) int a所有这些getter和setter都是为你自动定义的,那么你需要手动覆盖的任何getter或设置都可以像你写的那样写出来。
  • 请不要投票结束这个问题。这是一个完全可以接受的问题。至少解释一下你为什么投票结束。
  • @shruthibr 你还没有告诉我们“期望的输出”是什么。

标签: objective-c


【解决方案1】:

我会像这样重写整个类...

@interface Arithmetic:NSObject

@property (nonatomic, assign) NSInteger a;
@property (nonatomic, assign) NSInteger b;

- (NSinteger)add;

@end

@implementation Arithmetic

-(int)add {
    return self.a + self.b;
}

@end

您收到警告消息的原因是因为您有一个 ivar a,可以使用 a 访问它(不需要 [self a])。然后你有一个名为 a 的方法的参数,它隐藏了 ivar。

【讨论】:

    【解决方案2】:

    您收到该警告的原因是因为在函数中

    -(void)setA:(int)a {self.a=a;}
    

    参数(int)a 定义了一个名为a 的局部变量,它隐藏了接口中定义的int a,因为它们都具有相同的名称,并且默认行为是倾向于使用局部变量而不是更全局的变量。所以它只是警告你,如果你试图访问更全局的a,你就不会。

    【讨论】:

    • 如何访问全局变量
    • @shruthibr 我在回答中解释了这一点。您所说的“全局”实际上并不是全局的,但您只需使用变量名即可访问它。 a
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多