如果首先使用setter,如何在getter中实例化对象?

时间:2012-07-09 22:23:39

标签: initialization calculator getter stanford-nlp lazy-initialization

我正在完成斯坦福大学的讲座,计算器教程。 http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2011-fall

在其中他建议一个创建模型实例的好方法是在getter中使用以下方法分配/ init:

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

但是,第一次使用[operandStack]是:

 [self.operandStack addObject:operandObject];

据我所知,正在使用setter。

我可以看到它显然有效(它运行) - 但我无法理解为什么如果没有人试图从operandStack获得任何东西。有人可以赐教,我对任何搜索都没有运气。

1 个答案:

答案 0 :(得分:0)

你的误解似乎源于[self.operandStack addObject:operandObject];是一个“制定者”行动的想法。要将该表达式转换为英语:“将'addObject'消息发送到方法operandStack返回的NSMutableArray,并将operandObject对象传递给它。”

这似乎是一个点符号混乱。点符号简单地解析为基本函数调用。例如,上面的代码摘录可以使用熟悉的方括号表示法编写。像这样:

[[self operandStack] addObject:operandObject];

此表格仍然完全有效,甚至有些人更喜欢。在这种形式下,它可以让你更清楚地看到你实际上正在调用“getter”函数。