重写setter方法,并获得“xxx隐藏实例variables的本地声明”

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

在.h:

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

在.m中:

 @synthesize timeSignature; 

我希望覆盖setter方法:当用户为它设置一个新的值时,它会做一些其他的事情,以及更改为新的值:

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

inheritance人的问题,本地variables和实例variables具有相同的名称。

我怎样才能避免这一点?

为您的ivar _timeSignature并使@synthesize timeSignature = _timeSignature;

重命名参数variables名称:

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

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

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

只需重命名方法参数应该解决这个问题。 当你实际再次调用你的setter方法时,你的代码也会产生无限recursion – 你也需要删除属性调用:

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

重命名参数。 我使用一个aTimeSignaturenewTimeSignature

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

 self.timeSignature = someVar; 

仅仅是语法糖

 [self setTimeSignature: somevar]; 

点符号误导你认为属性不同于二传手。 这是不正确的,财产二传手和吸气剂。 你真正拥有的是这样的:

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

一旦您更改记号,您应该能够看到明显的困难。

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