0

我刚开始上斯坦福 iOS5 课程并完成了 RPN 计算器,但想让“清除”按钮的工作方式有所不同。这就是我现在的样子,没有改变 CalculatorModel “大脑”:

- (IBAction)clearPressed
{
    self.display.text = @"";                        // Clear the display
    self.historyWindow.text = @"";                  // Clear the history window
    self.model = nil;                               // Reset the stack
    self.userIsInMiddleOfEnteringNumber = NO;       // Reset user typing boolean
}

我可能错了,但是“self.model = nil;” 似乎它并没有真正从堆栈中删除对象,它只是模仿它。所以我在 CalculatorModel“大脑”中添加了一个函数:

-(void) clearOperandStack
{
    [self.operandStack removeAllObjects];
}

并想在 CalculatorViewController 中的“clearPressed”函数中调用它,但我遇到问题可能是因为我还没有完全理解目标 c。这是我认为我必须做的,但它似乎不想工作。

- (IBAction)clearPressed
{
    self.display.text = @"";                        // Clear the display
    self.historyWindow.text = @"";                  // Clear the history window
//    self.model = nil;                               // Reset the stack
    [self.model clearOperandStack];
    self.userIsInMiddleOfEnteringNumber = NO;       // Reset user typing boolean
}

有人可以向我解释调用该方法的正确方法/我做错了什么吗?

4

2 回答 2

1

这是另一个回答问题的线程的链接。

CS193P - 向 iOS 计算器添加取消按钮

让我们看看我能不能解释为什么 self.model = nil;

我将为您的模型使用一张纸的类比。在本文中,您可以编写堆栈,以及您的模型可能知道的任何其他内容。

假设您懒惰地为模型实例化了您的 getter(就像讲师所做的那样);当您调用 self.model 时,如果您已经有一张包含您的模型的纸,它会给您,如果您的模型没有一张纸,它会抓取一张空白纸并将其作为您的模型模型。

现在当你说 self.model = nil; 你是在告诉它扔掉你的模型纸。这意味着您现在不再拥有堆栈或模型中的任何其他东西。

现在随着 getter 被延迟实例化,当你下次请求你的模型时,它还没有,所以它会为你创建一个全新的模型。

所以也许一个快速的总结是 self.model = nil; 不会清空你的堆栈,它会完全扔掉堆栈,你没有空堆栈,你没有堆栈。

而您的 clearOperandsStack 只是清空堆栈,因此您有一个空堆栈。

于 2012-02-23T15:16:55.420 回答
0

我的作业1解决方案:https ://github.com/rl1987/CS193p-Homework-1

于 2012-02-22T16:11:15.917 回答