我无法在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上运行。
发布于 2012-08-02 14:19:24
您的Brain访问器方法正在创建一个无限循环。self.Brain调用此方法,您可以从其内部调用它。
首先,重构该属性,将其命名为brain。Objective-C中的属性和实例变量以小写字母开头。
像这样合成:
@synthesize brain = _brain;这将创建一个名为_brain的支持实例变量,它保存您的属性的值。(请注意,这在Xcode4.4中是自动完成的,但我们将把它留在这里进行说明)。
让你的存取器方法像这样。与您当前实现的主要不同之处在于,您使用的是支持ivar,而不是递归调用属性:
-(CalculatorBrain *)brain{
if(!_brain){
self.brain = [[CalculatorBrain alloc] init];
}
return _brain;
}请注意,使用属性设置值很好,因为这将调用setBrain,并确保调用自定义设置器中的任何内容。
https://stackoverflow.com/questions/11753199
复制相似问题