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 回答