override getter only needs @synthesize



我想ovveride getter用于惰性实例化,并保留默认的setter。

我需要@synthesis吗?

为什么?

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

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

否,如果显式实现了所有的访问器方法(readwrite属性的getter和setter,readonly属性只有getter),则只需要显式合成(以获得合成的ivar)。您已经为这个readwrite属性编写了getter,但没有编写setter,所以仍然会为您合成ivar。因此,就您的代码而言,您不需要显式地@synthesize

如果您将此属性设置为readonly,那么实现getter将阻止您的ivar被自动合成。同样,由于这是readwrite,如果同时实现getter和setter,则需要合成ivar(如果需要的话)。

不要以这种方式使用延迟初始化。Deck在没有卡的情况下是无用的,因此,无论何时第一次调用getter,惰性初始化都只会给你带来不确定的CPU消耗。幸运的是,简单地创建一个可变数组不需要任何成本(这也是不使用惰性初始化的原因)。

同样,出售可变集合也会破坏封装。一副牌应该包含所有的逻辑,以确定它包含哪套牌以及按什么顺序排列。通过出售可变集合,外部代码可以在Deck的背后更改该顺序。

除此之外,"设定"甲板的牌意味着什么?走这条路似乎将所有与将甲板保持在甲板类之外有关的逻辑都推到了甲板类之外,这就引出了一个问题,即为什么甲板在使用甲板的任何类中都只是一个普通的旧数组。

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

相关内容

最新更新