0

我在我的应用程序中使用了大约 10 个左右的 NSDecimalNumber,但我很难找到一种方法来一次将它们全部分配给情节提要上的所有各种按钮使用。viewcontroller.h 的@interface 本来是逻辑位置,但它不会让我越过“NSDecimalNumber *one”。我应该怎么办?

另外,由于我需要在每个对象中简单地更改值(而不是删除和重新创建),我应该如何处理内存释放?

我对编程还是很陌生,所以尽量不要过于技术化。提前致谢!

@Kurt Revis 好吧,让我举个例子:在 viewcontroller.h 中,我们有 1 个出口和 2 个动作,连接到一个标签和 10 个按钮。我们还有 NSDecimalNumbers 屏幕和数字。

@interface viewcontroller:UIViewController{
IBOutlet UILabel *CalculatorScreen;
NSDecimalNumber *screen;
NSDecimalNumber *digit;}
- (IBAction)DigitPressed:(id)sender;
- (IBAction)OperatorPressed:(id)sender;

当“DigitPressed”被点击时,NSDecimalNumber“屏幕”的计算方式如下:

- (IBAction)DigitPressed:(id)sender {    
screen= [[screen decimalNumberByMultiplyingBy: ten] decimalNumberByAdding:digit];}

(其中“十”也是一个 NSDN。)但为了做到这一点(或者我认为),必须像这样分配“屏幕”:

screen=[NSDecimalNumber alloc];

所以现在我们得到了这个:

- (IBAction)DigitPressed:(id)sender {    
screen=[NSDecimalNumber alloc];
screen= [[screen decimalNumberByMultiplyingBy: ten] decimalNumberByAdding:digit];}

- 但随后每次命中都会将其分配给一个新地址。同样,如果我尝试使用“OperatorPressed”部分中的数字,则必须独立分配它。

因此,我需要一种方法来分配内存一次,然后在我的 .m 文件的所有方法中一遍又一遍地使用该数字。

4

1 回答 1

3

我会通过并让这些东西工作。另外,我将更改您的某些名称的大小写以匹配典型的 Objective-C 实践——希望您不介意。

@interface ViewController : UIViewController {
    IBOutlet UILabel *calculatorScreen;
    NSDecimalNumber *screen;
}

- (IBAction)digitPressed:(id)sender;

@end

您需要初始化screen为一个合理的起始值。因为你的类是一个视图控制器,所以这样做的好地方是-viewDidLoad.

- (void)viewDidLoad
{
    [super viewDidLoad]; // in case your superclass needs to do any work

    screen = [NSDecimalNumber zero];

    // also, make sure it shows up in the UI
    calculatorScreen.text = [screen stringValue]; // Convert from NSDecimalNumber to NSString, and pushes it into the label
}

接下来是数字按钮。目前尚不清楚您是否希望有一种digitPressed:方法被所有 10 位按钮调用,或者它是否应该只用于其中一个按钮。首先,最简单的方法是为每个按钮单独操作。

这是“1”按钮的方法:

- (IBAction)digit1Pressed:(id)sender {
    // Create intermediate values
    NSDecimalNumber* one = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:NO];  // 1 * 10^0 = 1
    NSDecimalNumber* ten = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:1 isNegative:NO];  // 1 * 10^1 = 10

    // Compute the new result
    NSDecimalNumber* result = [[screen decimalNumberByMultiplyingBy:ten] decimalNumberByAdding:one];

    // Put the result back in the screen
    screen = result;

    // and update the UI
    calculatorScreen.text = [screen stringValue];
}

同样,“2”按钮将连接到此操作:

- (IBAction)digit2Pressed:(id)sender {
    NSDecimalNumber* two = [NSDecimalNumber decimalNumberWithMantissa:2 exponent:0 isNegative:NO];  // 1 * 10^0 = 1
    NSDecimalNumber* ten = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:1 isNegative:NO];  // 1 * 10^1 = 10

    // take a shortcut and don't bother with the `result` variable
    screen = [[screen decimalNumberByMultiplyingBy:ten] decimalNumberByAdding:two];
    calculatorScreen.text = [screen stringValue];
}

等等。请注意,我们不必在视图控制器中记住“一”、“二”和“十”——我们可以在需要它们时创建它们,并在使用完它们时释放它们。(是的,它的效率稍微低一些,但是这些对象又小又轻;你每秒可以创建数千个,但没人会注意到。)

您的下一个问题:拥有 10 个单独的“数字”动作不是很愚蠢吗?是的。您可以改为使用一个“digitPressed”操作来查看发件人,确定它是哪个按钮,然后做正确的事情。

区分哪个按钮是哪个按钮的简单方法:创建按钮时,将其设置tag为与其数字相同。您可以通过代码或在界面构建器中进行设置。然后,action 方法查找发送者的标签。

- (IBAction)digitPressed:(id)sender {
    NSDecimalNumber* digit = [NSDecimalNumber decimalNumberWithMantissa:[sender tag] exponent:0 isNegative:NO];  // digit * 10^0
    NSDecimalNumber* ten = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:1 isNegative:NO];  // 1 * 10^1 = 10
    screen = [[screen decimalNumberByMultiplyingBy:ten] decimalNumberByAdding:digit];
    calculatorScreen.text = [screen stringValue];
}
于 2013-01-06T04:59:16.330 回答