自定义Getter&Setter iOS 5

我想重写使用ARC的ObjC类中的getter和setter。

.h文件

@property (retain, nonatomic) Season *season; 

.m文件

 @synthesize season; - (void)setSeason:(Season *)s { self.season = s; // do some more stuff } - (Season *)season { return self.season; } 

我在这里错过了什么?

是的,那些是无限的recursion循环。 那是因为

 self.season = s; 

被编译器翻译成

 [self setSeason:s]; 

 return self.season; 

被翻译成

 return [self season]; 

摆脱点访问者 self. 你的代码将是正确的。

然而,这个语法可能会让人困惑,因为你的属性season和你的variablesseason共享同一个名字(尽pipeXcode通过以不同的方式着色这些实体可以减less混淆)。 可以通过写入明确地更改variables名称

 @synthesize season = _season; 

或者,更好的是,完全省略@synthesize指令。 现代的Objective-C编译器会为你自动合成访问器方法和实例variables。

如果你要实现你自己的getter和setter,你需要维护一个内部variables:

 @synthesize season = _season; - (void)setSeason:(Season *)s { // set _season //Note, if you want to retain (as opposed to assign or copy), it should look someting like this //[_season release]; //_season = [s retain]; } - (Season *)season { // return _season } 

你所缺less的是Objective-C编译器基本上把self.foo = bar语法变成了[self setFoo:bar] ,而self.foo变成了[self foo] 。 目前实施的方法正在调用自己。 正如Jeremy所build议的那样,你需要实现它们,使得setter实际上将它所调用的值赋给你的类的一个实例variables,并且getter返回那个实例variables的值。