覆盖setter方法并获取“xxx隐藏实例变量的本地声明”

时间:2012-04-25 07:26:40

标签: objective-c ios xcode override setter

我有一个整数变量,例如timeSignature,在.h文件中声明它,并合成了一对setter / getter方法:

在.h:

@interface Metronome : NSObject {
    int timeSignature;
}
@property (nonatomic) int timeSignature;

in .m:

@synthesize timeSignature;

我希望覆盖setter方法:当用户为其设置新值时,它会执行其他操作以及更改为新值:

- (void) setTimeSignature:(int)timeSignature {
    self.timeSignature = timeSignature; //hides instance variable warning at this line
    [self doesSomethingElse];
}

继承问题,局部变量和实例变量具有相同的名称。

我该如何避免这种情况?

4 个答案:

答案 0 :(得分:6)

重命名参数变量名称:

- (void) setTimeSignature:(int)newTimeSignature { 
    timeSignature = newTimeSignature; //hides instance variable warning at this line 
    [self doesSomethingElse]; 
} 

此外,不使用setter中的属性,这将创建一个无限循环! self.timeSignature =将调用setTimeSignature!

这是人们使用下划线名称(_timeSignature)作为属性的支持ivar的原因之一。

答案 1 :(得分:5)

为您的ivar命名_timeSignature并制作@synthesize timeSignature = _timeSignature;

答案 2 :(得分:1)

只需重命名方法参数即可解决问题。当你实际再次调用你的setter方法时,你的代码会产生无限递归 - 你还需要删除属性调用:

- (void) setTimeSignature:(int)timeSignature_ {
    timeSignature = timeSignature_; //hides instance variable warning at this line
    [self doesSomethingElse];
}

答案 3 :(得分:1)

重命名参数。我使用aTimeSignaturenewTimeSignature

此外,这是一个更大的问题:

self.timeSignature = someVar;

仅仅是

的语法糖
[self setTimeSignature: somevar];

点符号误导您认为该属性与二传手不同。事实并非如此,属性的setter和getter。你真正拥有的是:

- (void) setTimeSignature:(int)timeSignature {
    [self setTimeSignature: timeSignature]; //hides instance variable warning at this line
    [self doesSomethingElse];
}

一旦改变符号,你应该能够看到明显的困难。

如果你是Objective-C的新手,你应该真正避免使用点符号,直到你完全确信你完全理解它的作用(这是iOS编程的Big Nerd Ranch指南的建议)。