0

私はスタンフォード大学の iPhone アプリケーション開発の講義を受けており、最初の課題は 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 行を配置しましたが、そうではありません。2 行で 0 と null が返されます。@synthesize をもう (CalculatorBrain クラスで) 使用する必要がないことはわかっていますが、@synthesize を使用した場合と使用しない場合を試してみましたが、とにかくアイテムが追加されていません。

誰でも私を助けることができますか?

ありがとうございました。

4

2 に答える 2

3

@synthesizeプロパティのセッターとゲッターのみを作成します。これらは、最新の Objective-C のデフォルトです。ただし@syntehsize、オブジェクトを初期化せず、それ自体を割り当てます。したがって、まだ初期化する必要がありますbrain。デフォルト値は ですnil。したがって、新しいオブジェクトを割り当てない限り、そのままになりますnil。そのため、これらの値を取得していました。

あなたはそれを行うことができます- viewDidLoad

- (void) viewDidLoad {
    self.brain = [[CalculatorBrain alloc] init];
}
于 2013-06-05T17:54:39.443 に答える
2

ほぼ確実self.brainに nil です。ログも記録してみてください。

于 2013-06-05T17:53:51.300 に答える