1

我有一个整数变量,例如 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];
}

这就是问题所在,局部变量和实例变量具有相同的名称。

我怎样才能避免这种情况?

4

4 回答 4

6

重命名参数变量名称:

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

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

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

于 2012-04-25T07:28:56.400 回答
5

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

于 2012-04-25T07:28:35.500 回答
1

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

- (void) setTimeSignature:(int)timeSignature_ {
    timeSignature = timeSignature_; //hides instance variable warning at this line
    [self doesSomethingElse];
}
于 2012-04-25T07:28:19.020 回答
1

重命名参数。我使用aTimeSignaturenewTimeSignature

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

self.timeSignature = someVar;

只是语法糖

[self setTimeSignature: somevar];

点符号会误导您认为该属性与 setter 不同。这不是真的,属性setter 和 getter。你真正拥有的是:

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

更改符号后,您应该能够看到明显的困难。

如果您是 Objective-C 的新手,那么在您完全确信自己完全理解它的作用之前,您应该真正避免使用点符号(这是 Big Nerd Ranch iOS 编程指南的建议)。

于 2012-04-25T07:55:18.727 回答