2013-06-05 68 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是零 - 嘗試記錄它。

相關問題