我刚开始使用斯坦福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“brain”中添加了一个函数:
-(void) clearOperandStack
{
[self.operandStack removeAllObjects];
}
并希望在我的“clearPressed”函数中调用它在CalculatorViewController中,但我可能有问题,因为我还没有完全理解目标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
}
有人可以向我解释一下调用该方法/我做错了什么的正确方法吗?
答案 0 :(得分:1)
这是另一个回答问题的线程的链接。
CS193P - Adding cancel button to iOS calculator
让我们看看我能解释为什么self.model = nil;
我将使用一张纸的类比为您的模型。在本文中,您可以编写堆栈,以及模型可能知道的任何其他内容。
假设您懒惰地为模型实例化了你的getter(就像讲师一样); 当你打电话给self.model时,如果你已经有一张纸上有你的模型,那么它会给你,如果你的模型没有一张纸,它会抓住一张白纸然后把它弄成你的模型。
现在当你说self.model = nil;你告诉它扔掉你的模型纸。这意味着您现在可以更长时间地拥有堆栈,或模型中的任何其他内容。
现在,当getter被懒惰地实例化时,当你下次要求你的模型时它还没有,所以它会为你制作一个全新的模型。
所以也许快速摘要是self.model = nil;不会清空堆栈,它会完全抛弃堆栈,没有空堆栈,没有堆栈。
而你的clearOperandsStack只是清空堆栈,所以你有一个空堆栈。
答案 1 :(得分:0)