0

NSMutableArray にプッシュすることができません

添付のコードを参照してください

#import "CalculatorBrain.h"

@implementation CalculatorBrain

@synthesize operandStack = _operandStack;

-(NSMutableArray*) operandStack{
    if(self.operandStack == NULL){
        self.operandStack = [[NSMutableArray alloc] init];
    }
    return self.operandStack;
}

-(void)setOperandStack:(NSMutableArray *)operandStack{
    _operandStack = operandStack;
}

-(void) pushOperand:(double) operand{
    [self.operandStack addObject:[NSNumber numberWithDouble:operand]];
    int count = [self.operandStack count];
    NSLog(@"Number pushed is %g", [[self.operandStack objectAtIndex:count - 1] doubleValue]);
}

-(double)popOperand{
    int count = [self.operandStack count];
    NSNumber* value = [self.operandStack objectAtIndex:count - 1];
    double val = 0;
    if(value){
        val = [value doubleValue];
        [self.operandStack removeLastObject];
    }
    NSLog(@"popped %g",val);
    return val;
}
@end

アクションは次のように呼び出されます。

- (IBAction)enterPressed {
    double mynumber= [self.display.text doubleValue];
    NSLog(@"enter pressed....Number is %g", mynumber);
    [self.Brain pushOperand:mynumber];
    int count = [self.Brain.operandStack count];
    NSLog(@"enter pressed... pusehed operand is %g", [[self.Brain.operandStack objectAtIndex:count - 1] doubleValue]);
    self.amIInMiddleOfNumber = NO;
}

このプログラムを使用して得ている出力は

 2012-07-31 22:30:53.838 Calculator[13408:c07] enter pressed....Number is 45
 2012-07-31 22:30:53.840 Calculator[13408:c07] enter pressed... pusehed operand is 0

私もlastObjectを試しましたが、うまくいきませんでした。

ここで編集 ----------

これを追加してみました

  -(CalculatorBrain *)Brain{
      if(self.Brain == NULL){
          self.Brain = [[CalculatorBrain alloc] init];
      }
      return self.Brain;
  }

そして今、私の出力は

  2012-08-01 21:03:00.282 Calculator[13706:c07] enter pressed....Number is 23

その後、アプリ全体がクラッシュします

ありがとう。同じプログラムが xcode と lion で動作しているのを見ました。

4

1 に答える 1

0

のアクセサ メソッドBrainが無限ループを作成しています。self.Brainはこのメソッドを呼び出し、それ自体から呼び出します。

最初に、プロパティをリファクタリングして、 と呼ばれるようにしますbrain。Objective-C のプロパティとインスタンス変数は小文字で始まります。

次のように合成します。

@synthesize brain = _brain;

これにより、プロパティの値を保持する _brain というバッキング インスタンス変数が作成されます。(これは Xcode 4.4 で自動的に行われることに注意してください。ただし、説明のためにここに残します)。

アクセサ メソッドを次のようにします。現在の実装との主な違いは、バッキング ivar を使用しており、プロパティを再帰的に呼び出していないことです。

-(CalculatorBrain *)brain{
    if(!_brain){
        self.brain = [[CalculatorBrain alloc] init];
    }
    return _brain;
}

プロパティを使用して値を設定しても問題ないことに注意してください。これは、setBrain を呼び出しているためであり、カスタム セッター内のすべてが呼び出されていることが保証されます。

于 2012-08-02T06:19:24.380 に答える