如何让实例变量复制值



问题 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值发生变化的地方,因此它是开始查找的明显位置。

最新更新