懒惰的实例化

Tos*_*shi 6 properties objective-c ios

好吧,我只是在应该使用惰性实例化时感到困惑.我理解懒惰实例化的基本概念.

"我理解所有属性在Objective-C中以nil开头,并且向nil发送消息不起作用,因此必须使用[[Class alloc] init]初始化;在向新创建的属性发送消息之前."(Lazy Objective-C/iPhone开发中的实例化)

m.file:

@property (strong, nonatomic) NSMutableArray *cards; 

- (NSMutableArray *)cards
{
    if (!_cards) _cards = [[NSMutableArray alloc] init];
    return _cards;
}

- (void)addCard:(Card *)card atTop:(BOOL)atTop
{
    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
} }
Run Code Online (Sandbox Code Playgroud)

那么,我真的没有得到的是当我应该使用这种类型的实例化时?大多数情况下,我看到这样的代码:

h.file:

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents;
Run Code Online (Sandbox Code Playgroud)

m.file:

 if([card.contents isEqualToString:self.contents]){
        score = 1;
    }
Run Code Online (Sandbox Code Playgroud)

*这可能是一个愚蠢的问题,但我真的很困惑.我是新来的,谢谢.

tro*_*foe 2

如果您发现延迟实例化/延迟初始化令人困惑,则没有理由使用它;只需在类init方法中初始化实例变量/属性即可,不用担心。

由于该对象是作为调用 getter 方法的副作用而创建的,因此根本无法立即明显看出它正在创建,因此一种替代方案(这也意味着您可以使用默认的编译器生成 getter 方法)是显式检查它addCard

- (void)addCard:(Card *)card
          atTop:(BOOL)atTop
{
    if (!self.cards)
        self.cards = [NSMutableArray new];

    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
    }
}
Run Code Online (Sandbox Code Playgroud)

(并删除用户提供的 getter 方法)

然而,最终效果与您发布的代码相同,除了self.cards将返回nil直到addCard被调用之外,但我怀疑这会导致问题。

  • `addCard:atTop:` 在使用 `self.cards` 时会调用 getter,所以在调用 `addCard:atTop:` 时当然会创建 `_cards`。 (3认同)