7

我想为惰性实例化设置 getter 并保留默认设置器。

我需要@synthesize 吗?

为什么 ?

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

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

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

4

3 回答 3

16

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

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

于 2013-12-11T15:11:56.950 回答
5

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

As well, vending a mutable collection breaks encapsulation. A Deck should contain all the logic for determine what set of Cards it contains and in what order. By vending a mutable collection, an external bit of code can change that order behind the Deck's back.

Beyond that, what does it even mean to "set" a Deck's cards? Going that route seemingly pushes all logic related to maintaining the Deck outside of the Deck class, begging the question as to why the deck is nothing more than a plain old array in whatever class uses the deck.

于 2013-12-11T15:24:58.943 回答
0

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

于 2013-12-11T15:12:28.343 回答