Objective c 推动NSMutableArray在Xcode 4.4 mountain lion中不工作

Objective c 推动NSMutableArray在Xcode 4.4 mountain lion中不工作,objective-c,ios5.1,Objective C,Ios5.1,我无法在NSMutableArray上推送内容 请参阅所附代码 #import "CalculatorBrain.h" @implementation CalculatorBrain @synthesize operandStack = _operandStack; -(NSMutableArray*) operandStack{ if(self.operandStack == NULL){ self.operandStack = [[NSMutableArray

我无法在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上运行。

你的
大脑的访问器方法正在创建一个无限循环<代码>自我。大脑
调用这个方法,你从自身内部调用它

首先,重构属性,使其称为
brain
。Objective-C中的属性和实例变量以小写字母开头

这样综合:

@synthesize brain = _brain;
这将创建一个名为_brain的支持实例变量,它保存属性的值。(请注意,这在Xcode 4.4中现在是自动完成的,但我们将把它留在这里以供说明)

使您的访问器方法如下所示。当前实现的主要区别在于,您使用的是支持ivar,而不是递归调用属性:

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

请注意,使用属性设置值是可以的,因为这是在调用setBrain,并确保调用自定义setter中的任何内容

operanstack
中的
self.operanstack
引用看起来很奇怪……通常语法
self.operanstack
(不带
=
)意味着
[self operanstack]
,因此代码好像在调用自己。如果将
操作数堆栈
方法中的引用更改为直接使用实例变量
\u operandStack
会怎么样?另外,
%g
需要一个浮点,但传递的是double.self.Brain将为零。问题不在这段代码中。赛尔夫在哪里?大脑设置?是的,我同意@jtruton-self。大脑为零。请注意,您不应该用大写字母命名IVAR/properties,因为这完全弄乱了apple用于创建setter的启发式方法-即使用property foo,您将得到一个“-()foo{…”和-(void)setFoo:…@synthesis Brain=\u Brain;我会这样做。我将尝试创建一个类似这样的setter-(Brain*)Brain{if(self.Brain==NULL)self.Brain=[[Brain alloc]init];返回self.Brain;}我试过了,但没用。我对操作数堆栈也做了同样的操作,但没有解决问题,但是的,至少我的代码不再挂起。我可以通过电子邮件或其他方式向你发送我的文件吗。我知道这不是解决问题的方法,但询问也无妨。一旦我们找到了解决方案,你可以在这里发布答案,我可以在上面打勾,这样其他人都能找到答案lso知道答案你可以把你的项目放在GitHub上,然后在你的问题中链接到它。很难相信是操作系统更新导致了这个问题。“没有工作”也很模糊。你现在看到了什么日志?你有没有使用调试器来逐步调试你的代码?这会让问题很明显。