我想使用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;
}
我在这里错过了什么吗?
答案 0 :(得分:88)
是的,那些是无限的递归循环。那是因为
self.season = s;
由编译器翻译成
[self setSeason:s];
和
return self.season;
被翻译成
return [self season];
摆脱 dot-accessor self.
,您的代码将是正确的。
但是,由于您的属性season
和变量season
具有相同的名称,因此这种语法可能会造成混淆(尽管Xcode会通过不同地着色这些实体来减少混淆)。可以通过编写
@synthesize season = _season;
或者,更好的是,完全省略@synthesize
指令。现代的Objective-C编译器将自动为您合成访问器方法和实例变量。
答案 1 :(得分:16)
如果你要实现自己的getter和setter,你需要维护一个内部变量:
@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
}
答案 2 :(得分:5)
您缺少的是Objective-C编译器基本上将self.foo = bar
语法转换为[self setFoo:bar]
,将self.foo
语法转换为[self foo]
。您目前实施的方法正在调用自己的方法。正如Jeremy建议的那样,你需要实现它们,以便setter实际上将它调用的值赋给类上的实例变量,getter返回该实例变量的值。