我刚刚开始学习斯坦福大学的iOS5课程,并且已经完成了RPN计算器,但我想让"Clear“按钮的工作方式稍有不同。这就是我现在的方式,没有改变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“函数中调用它,但我遇到了问题,可能是因为我还没有完全理解objective 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
}有人能给我解释一下调用该方法的正确方法/我做错了什么吗?
发布于 2012-02-23 00:11:16
我的任务1的解决方案:https://github.com/rl1987/CS193p-Homework-1
发布于 2012-02-23 23:16:55
这里有一个链接指向另一个回答这个问题的帖子。
CS193P - Adding cancel button to iOS calculator
让我们看看我是否能解释为什么self.model = nil;
我将在你的模型中使用一张纸的类比。在这张纸上,你可以写你的堆栈,加上你的模型可能知道的任何额外的东西。
假设你懒惰地为模型实例化了getter (就像讲师做的那样);当你调用self.model时,如果你已经有一张纸已经有了你的模型,它会给你一张纸,如果你没有一张纸给你的模型,它会抓起一张空白的纸把它变成你的模型。
现在,当你说self.model =nil时,你是在告诉它扔掉你的模型纸。这意味着你现在不再有一个堆栈,或者模型中的任何其他东西。
现在,随着getter被懒惰地实例化,当你下次请求你的模型时,它还没有一个,所以它会为你创建一个全新的模型。
所以也许简单的总结是self.model = nil;不会清空堆栈,它会完全丢弃堆栈,你没有空的堆栈,你没有堆栈。
而你的clearOperandsStack,只是清空堆栈,所以你有一个空的堆栈。
https://stackoverflow.com/questions/9388357
复制相似问题