问题 1:如何让实例变量创建更改的值的永久副本(在本例中为 self.display.text)而不是指针?
问题2:我的术语在陈述问题的方式上是否正确?
我现在开始使用 Obj-c 几周了,我遇到了这个问题。 我认为部分问题在于我不知道正确的术语(因此很难找到解决方案)。 所以它在这里:
This is a basic calculator program:
1)User inputs their first number
2)User presses an action (+, -, *, /)
2a) first inputted number is saved; display is reset
3)User inputs second number
4)User presses enter
4a) second inputed number is saved; action is performed on the first and second number
This declares my CalculatorViewController.h
@interface CalculatorViewController : UIViewController
@property double firstNumber, secondNumber, result;
@property int actionType;
@property (weak, nonatomic) IBOutlet UILabel *display;
@property BOOL userIsInTheMiddleOfEnteringANumber;
@end
Implementation here...
// method for when someone clicks an action item on the calculator (such as +, -, *, /)
- (IBAction)pressedAction:(UIButton *)sender {
self.firstNumber = [self.display.text doubleValue];
(action type is set here)
NSLog(@"Action Type: %i", self.actionType);
NSLog(@"FN: %f, SN: %f", self.firstNumber, self.secondNumber);
}
// method for when someone clicks enter (and therefore firstNumber and secondNumber are set
- (IBAction)pressedEnter {
self.secondNumber = [self.display.text doubleValue];
NSLog(@"f: %f, s: %f", self.firstNumber, self.secondNumber);
// should do the given action to the self.firstNumber, self.secondNumber here
}
这是我的问题:firstNumber 被设置为指向 self.display.text(屏幕上的标签/输出)的指针(术语?),而不是在分配时成为永久副本。 因此,当有人单击加号后数字更改时,随着输入的更多数字,第一个数字也会更改。
感谢您的帮助! 我真的很感激!
这是我的问题:firstNumber 被设置为指向 self.display.text(屏幕上的标签/输出)的指针(术语?),而不是在分配时成为永久副本。
这不可能是真的。 firstNumber
是一个double
,而不是一个指针。如果之后self.display.text
发生变化,firstNumber
也不会改变。
您可以在代码中对此进行测试,以亲自查看:
self.display.text = @"1.0";
self.firstNumber = [self.display.text doubleValue];
self.display.text = @"2.0";
NSLog(@"firstNumber is: %g", self.firstNumber);
您会发现,即使进行了self.display.text
更改,self.firstNumber
也不会。
所以,你的问题在别的地方。 也许您的-pressedAction:
方法被调用的频率比您想象的要高?在 iOS 中,按下按钮时可能会发送多个操作 - 也许您复制并粘贴了一个正在发送-pressedAction:
的按钮,然后您向该按钮添加了另一个操作。
您描述的问题与您在代码中显示的内容并不真正匹配。 您已将firstNumber
声明为双精度:
@property double firstNumber;
。它不是指向双精度(或其他任何东西)的指针。 当您为其分配值时,分配的值不会再次更改,除非/直到您显式地将新值分配给firstNumber
(假设您没有执行任何操作,例如手动创建指向firstNumber
的指针,然后使用该指针间接更改值)。
此外,您通过执行以下操作为firstNumber
分配一个值:
self.firstNumber = [self.display.text doubleValue];
对字符串调用 doubleValue
时,将分析当前字符串值并将其作为双精度值返回。 返回值不会以任何方式与字符串耦合,并且如果字符串的文本发生更改,则不会修改。
所以问题出在代码中的其他地方。 这可能与您设置IBAction
映射的方式有关。 您的 firstNumber
属性已针对您所说的所需行为正确设置,并且您的代码似乎正在正确使用它。
在没有更多上下文的情况下,我能提出的唯一建议是在pressedAction:
中设置断点,以确保它不会被多次调用。 这是示例代码中唯一一个firstNumber
值发生变化的地方,因此它是开始查找的明显位置。