@property,setter和getter的问题?

时间:2010-03-22 19:30:14

标签: objective-c cocoa

NSString *statusValue;
NSString *currentValue;

@property(retain, nonatomic) NSString *statusValue;
@property(retain, nonatomic) NSString *currentValue;

@synthesize statusValue;
@sythnesize currentValue;

鉴于上述情况,如果我将一个变量设置为另一个变量,我应该这样做......

[self setStatusValue: currentValue];

或者我应该再次使用该属性并使用...

[self setStatusValue: [self currentValue]];

我认为后者(尽管可能有些过分)确实告诉读者我们正在使用其中一个对象实例变量,而不是一些局部变量。

真的很好奇,我跟底部一样,但只是想在有人看我的代码之前检查,什么时候“什么鬼”:)

gary

3 个答案:

答案 0 :(得分:3)

两者都很好。您使用哪一种可能取决于您希望的副作用。例如,通过使用[self currentValue],您可以触发willAccessValueForKey:didAccessValueForKey: KVO通知,但前提是某人实际上正在观察该属性,并且只有当它是NSManagedObject子类时。通常没有任何重大副作用。

就我个人而言,我可能会使用后一个例子,这样我就不必担心如果我决定改变它就改变了30个地方的iVar名称(当然,Refactor-> Rename工具将是在这种情况下使用的权利,但仍然是。)

答案 1 :(得分:2)

我在没有令人信服的理由的情况下使用后者。这样它就可以使用重写的访问器,更改的实现等,而无需任何更改。例如,我可能决定从存储statusValue作为字符串切换,而是存储状态对象,statusValue通过该对象。如果我在整个地方手动访问ivar,我必须更改所有这些。如果我正在通过类的公共接口,我只需要更改一个访问器方法。

答案 2 :(得分:0)

这是有效的,更具表现力的IMO:

self.statusValue = currentValue;