Objective c 推动NSMutableArray在Xcode 4.4 mountain lion中不工作
我无法在NSMutableArray上推送内容 请参阅所附代码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
#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上,然后在你的问题中链接到它。很难相信是操作系统更新导致了这个问题。“没有工作”也很模糊。你现在看到了什么日志?你有没有使用调试器来逐步调试你的代码?这会让问题很明显。