定制吸气剂& Setter iOS 5

时间:2012-01-04 17:04:43

标签: objective-c ios automatic-ref-counting getter-setter

我想使用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;
}

我在这里错过了什么吗?

3 个答案:

答案 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返回该实例变量的值。