如何让实例变量复制值

时间:2012-06-11 01:14:11

标签: objective-c

问题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(它是屏幕上的标签/输出)的指针(术语?),而不是在分配时作为永久副本。因此,当某人点击加号后数字发生变化时,第一个数字会随着输入更多数字而改变。

感谢您的帮助!我真的很感激!

2 个答案:

答案 0 :(得分:1)

  

这是我的问题:firstNumber被设置为self.display.text(它是屏幕上的标签/输出)的指针(术语?),而不是在分配时作为永久副本。

这不可能是真的。 firstNumberdouble,而不是指针。如果之后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:的按钮,然后您又向该按钮添加了另一个动作。

答案 1 :(得分:0)

您所描述的问题与您在代码中显示的问题并不完全一致。您已将firstNumber声明为double:

@property double firstNumber;

...它不是指向double(或其他任何东西)的指针。为其分配值时,除非/直到您向firstNumber显式指定新值,否则指定的值不会再次更改(假设您没有执行任何操作,例如手动创建指向firstNumber的指针然后使用指针间接更改值)。

而且,您通过执行以下操作为firstNumber分配值:

self.firstNumber = [self.display.text doubleValue];

当您在字符串上调用doubleValue时,将解析当前字符串值并将其作为double返回。返回的值不以任何方式耦合到字符串,如果字符串的文本发生更改,则不会修改。

所以问题出在代码中的其他地方。可能与您设置IBAction映射的方式有关。您的firstNumber属性已针对您想要的行为进行了正确设置,并且您的代码似乎正在正确使用它。

如果没有更多上下文,我可以做的唯一建议就是在pressedAction:中设置一个断点,以确保它不被多次调用。这是示例代码中firstNumber的值发生变化的唯一位置,因此它是开始查看的明显位置。