懒惰的实例化

时间:2013-12-25 08:20:03

标签: ios objective-c properties

嗯,我应该在使用惰性实例化时感到困惑。 我理解懒惰实例化的基本概念。

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

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];
} }

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

h.file:

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents;

m.file:

 if([card.contents isEqualToString:self.contents]){
        score = 1;
    }

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

2 个答案:

答案 0 :(得分:2)

如果您发现混淆,则没有理由使用Lazy Instantiation / Lazy Initialization;只需在类init方法中初始化您的实例变量/属性,不要担心它。

由于对象是作为调用getter方法的副作用而创建的,所以它根本不是显而易见的,所以一种替代方法,这也意味着你可以使用默认的compiler-generate 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];
    }
}

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

然而,净效应与您发布的代码相同,但self.cards将在调用nil之前返回addCard,但我怀疑这会导致问题

答案 1 :(得分:1)

使用点表示法访问实例变量时,您将为该给定属性调用getter方法。因此,通过使用点表示法和延迟实例化,在发送消息之前,getter将始终断言属性不是nil。因此,代码如

[self.cards insertObject:card atIndex:0];

实际上会在self.cards上调用getter;如果你在对象上使用点符号并相应地编程getter,你将始终确保分配和初始化你的实例变量,同时清理你的init方法以获得更重要的代码。

懒惰实例化是Objective-C程序员的常见做法;我建议进入大会的流程。

编辑:感谢Raphael先前在评论中提到这一点。