2013-06-05 120 views
0

我正在参加Stanford's iPhone application development的讲座,第一项任务是构建RPN计算器。将项添加到NSMutableArray不起作用

我有一个问题,可能是我错过了一些简单的事情。

有一个模型类,称为CalculatorBrain:

.H

#import <Foundation/Foundation.h> 

@interface CalculatorBrain : NSObject 

- (void)pushOperand:(double)operand; 
- (double)performOperation:(NSString *)operation; 

@property (nonatomic, strong) NSMutableArray *operandStack; 

@end 

.M

#import "CalculatorBrain.h" 

@interface CalculatorBrain() 

@end 

@implementation CalculatorBrain 

@synthesize operandStack = _operandStack; 

- (NSMutableArray *)operandStack 
{ 
    if (!_operandStack) { 
     _operandStack = [[NSMutableArray alloc] init]; 
    } 

    return _operandStack; 
} 

- (void)pushOperand:(double)operand 
{ 
    NSNumber *operandObject = [NSNumber numberWithDouble:operand]; 
    [self.operandStack addObject:operandObject]; 
} 

- (double)popOperand 
{ 
    NSNumber *operandObject = [self.operandStack lastObject]; 
    if (operandObject) [self.operandStack removeLastObject]; 
    return [operandObject doubleValue]; 
} 

@end 

还有的控制器类,CalculatorViewController: .H

#import <UIKit/UIKit.h> 

@interface CalculatorViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UILabel *display; 

@end 

.m

#import "CalculatorViewController.h" 
#import "CalculatorBrain.h" 

@interface CalculatorViewController() 
@property (nonatomic) BOOL userIsInTheMiddleOfEnteringANumber; 
@property (nonatomic, strong) CalculatorBrain *brain; 
@end 

@implementation CalculatorViewController 

- (IBAction)digitPressed:(UIButton *)sender { 
    NSString *digit = [sender currentTitle]; 
    NSString *currentDisplayText = self.display.text; 

    if (self.userIsInTheMiddleOfEnteringANumber) { 
     self.display.text = [currentDisplayText stringByAppendingString:digit]; 
    } 
    else { 
     self.display.text = digit; 
     self.userIsInTheMiddleOfEnteringANumber = YES; 
    } 
} 

- (IBAction)enterPressed { 
    [self.brain pushOperand:[self.display.text doubleValue]]; 

    NSLog(@"count: %lu", (unsigned long) [self.brain.operandStack count]); 
    NSLog(@"index 0: %@", [self.brain.operandStack objectAtIndex:0]); 
    self.userIsInTheMiddleOfEnteringANumber = NO; 
} 

@end 

问题出在enterPressed方法中。正如你所看到的,我把2个NSLog行看看数字是否被压入数组,但它们不是。这两行返回我0和null。 我知道我不需要再使用@synthesize(在CalculatorBrain类中),但是我尝试过使用和不使用它,而且项目也没有被添加。

任何人都可以帮助我吗?

谢谢。

+0

懒惰创作的NSMutableArray在吸气剂是相当不规范。最好在初始化器中创建它,这也可以完全消除自定义getter/setter。 – bbum

回答

3

@synthesize只为属性创建setter和getters。它们是现代Objective-C中的默认设置。但是@syntehsize不会初始化对象并自行分配它。所以你仍然需要初始化brain。默认值是nil。所以除非你给它分配一个新的对象,它将保持nil。这就是你获得这些价值的原因。

你可以做,在- viewDidLoad

- (void) viewDidLoad { 
    self.brain = [[CalculatorBrain alloc] init]; 
} 
+0

非常感谢(: – gabsferreira

+1

初始化在分配1的演练文档中。页面199.他们让你懒初始化 –

+0

Woops,猜我错过了,由于某种原因,谢谢(: – gabsferreira

2

几乎肯定self.brain是零 - 尝试记录它。

相关问题