向NSMutableArray添加项目不起作用

时间:2013-06-05 17:49:01

标签: iphone ios objective-c

我正在参加Stanford's iPhone application development的讲座,第一项任务是建立一个RPN计算器。

我遇到的问题可能很简单,我错过了。

有一个名为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类中)但是我已经尝试过使用和不使用它,并且无论如何都没有添加项目。

有人能帮助我吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

@synthesize仅为属性创建setter和getter。它们是现代Objective-C中的默认值。但@syntehsize不初始化对象并自行分配。所以你仍然需要初始化brain。默认值为nil。因此,除非您为其指定新对象,否则它将保留nil。这就是你获得这些价值的原因。

您可以在- viewDidLoad

中执行此操作
- (void) viewDidLoad {
    self.brain = [[CalculatorBrain alloc] init];
}

答案 1 :(得分:2)

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