我有一个整数变量,例如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];
}
继承问题,局部变量和实例变量具有相同的名称。
我该如何避免这种情况?
答案 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)
重命名参数。我使用aTimeSignature
或newTimeSignature
。
此外,这是一个更大的问题:
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指南的建议)。