重写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]; }
重命名参数。 我使用一个aTimeSignature
或newTimeSignature
。
另外,这是一个更大的问题:
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议)。