0

アプリで約 10 個ほどの NSDecimalNumbers を使用していますが、ストーリーボードのさまざまなボタンすべてで使用するためにそれらを一度に割り当てる方法を見つけるのに苦労しています。viewcontroller.h の @interface が論理的な場所でしたが、「NSDecimalNumber *one」を超えることはできません。私は何をすべきか?

また、(削除して再作成するのではなく) 各オブジェクトの値を単純に変更する必要があるため、メモリの解放についてはどうすればよいですか?

私はまだプログラミングにかなり慣れていないので、技術的になりすぎないようにしてください。前もって感謝します!

@Kurt Revis では、例を挙げてみましょう。viewcontroller.h には、ラベルと 10 個のボタンに接続された 1 つのアウトレットと 2 つのアクションがあります。NSDecimalNumbers 画面と数字もあります。

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

"DigitPressed" がヒットすると、NSDecimalNumber "screen" が viewcontroller.m で次のように計算されます。

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

(「ten」も 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妥当な開始値に初期化する必要があります。あなたのクラスはViewControllerなので、それを行うのに適した場所はです-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
}

次に、数字ボタン。10桁のボタンすべてによって呼び出されるメソッドが1つあると予想したのdigitPressed:か、それともボタンの1つだけに対して呼び出されるはずだったのかは不明です。まず、ボタンごとに個別のアクションを実行するのが最も簡単です。

「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];
}

等々。ビューコントローラで「1」、「2」、「10」を覚えておく必要はありませんでした。必要なときに作成し、使い終わったら割り当てを解除することができます。(はい、少し非効率的ですが、これらのオブジェクトは小さくて軽量です。毎秒何千ものオブジェクトを作成でき、誰も気付かないでしょう。)

あなたの次の質問:10個の別々の「数字」アクションを持つのはばかげていませんか?はい。代わりに、送信者を調べ、それがどのボタンであるかを判断し、正しいことを実行する1つの「digitPressed」アクションを実行できます。

どのボタンがどれであるかを簡単に見分ける方法:ボタンを作成するときに、tagその数字と同じになるように設定します。これは、コードまたはInterfaceBuilderで設定できます。次に、アクションメソッドは送信者のタグを検索します。

- (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 に答える