我想为懒惰的实例化提供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和酒吧。
答案 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,只需定义一个。你将获得免费的默认设置器。