自定义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的值。