override getter只需要@synthesize

时间:2013-12-11 15:07:36

标签: objective-c xcode5 getter-setter synthesize

我想为懒惰的实例化提供ovveride getter并保留默认的setter。

我需要@synthesize吗?

为什么?

@interface Foo()
@property (strong, nonatomic) NSObject *bar;
@end

@implementation Foo
- (NSObject *)bar
{
    if(!_bar) _bar = [[NSObject alloc] init];
    return _bar;
}
@end

更新:我更改了变量和类名,因为它令人困惑。从甲板和卡到Foo和酒吧。

3 个答案:

答案 0 :(得分:16)

不,如果你明确地实现了所有的访问器方法(readwrite属性的getter和setter,只需要readonly属性的getter,你只需要显式合成(获取合成的ivar) )。你已经为这个readwrite属性编写了getter,但没有为setter编写,所以ivar仍然会为你合成。因此,正如您的代码所代表的那样,您无需明确@synthesize

如果你创建了这个属性readonly,那么实现一个getter会阻止你的ivar自动合成。同样地,因为这是readwrite,如果你同时实现了getter和setter,那么你需要合成ivar(如果你想要的话)。

答案 1 :(得分:5)

不要以这种方式使用延迟初始化。如果没有卡片,甲板就没用了,因此,懒惰的初始化只会在第一次调用该getter时对你进行不确定的消耗。幸运的是,简单地创建一个可变数组就没有任何成本(这也是不使用延迟初始化的原因)。

同样,出售可变集合会破坏封装。甲板应该包含所有逻辑,用于确定它包含的卡组和顺序。通过出售可变集合,外部代码可以改变Deck背后的顺序。

除此之外,它甚至意味着“设置”甲板卡?走这条路线似乎推动了所有与维护甲板之外的甲板相关的逻辑,乞求问题为什么甲板只不过是一个普通的旧阵列,无论什么类使用甲板。

答案 2 :(得分:0)

在iOS 7中,您通常不需要合成。如果你想要一个自定义的getter,只需定义一个。你将获得免费的默认设置器。