Objective c 计算器应用程序-奇怪错误:';无法识别的选择器发送到实例';尝试更新显示时

Objective c 计算器应用程序-奇怪错误:';无法识别的选择器发送到实例';尝试更新显示时,objective-c,xcode,Objective C,Xcode,我对Objective-C比较陌生,所以我并不是百分之百地了解我编写的所有东西。然而,我正在处理我的错误,因为它们发生了,我得到了一个运行时错误,我不知道如何修复。错误声明“未识别的选择器[已]发送到实例。” - (IBAction) equalsPressed{ self.userIsInTheMiddleOfTypingANumber = NO; if (self.brain.operationIsPicked) { [self.brain pushOperan

我对Objective-C比较陌生,所以我并不是百分之百地了解我编写的所有东西。然而,我正在处理我的错误,因为它们发生了,我得到了一个运行时错误,我不知道如何修复。错误声明“未识别的选择器[已]发送到实例。”

- (IBAction) equalsPressed{
    self.userIsInTheMiddleOfTypingANumber = NO;
    if (self.brain.operationIsPicked) {
       [self.brain pushOperand: [self.display.text doubleValue]]; 
       double result = [self.brain performOperation: self.brain.operation];
       // The line below this 
       self.display.text = [NSString stringWithFormat: @"%g", result];
    }
}
我正在使用斯坦福大学教授教授教授的计算器应用程序,他的课程发布在iTunes U上。但是,我对其进行了编辑,使其不包含enterPressed命令,而是使用了一个经过修改且更为用户友好的“EqualPressed”。EqualPressed完成后(即当我单击计算器上的等号时),会显示错误。有人知道是什么导致了这个问题吗?我已经发现其他人的错误与此非常相似,但发生在稍微不同的地方。下面是有助于阐明问题的其他代码片段

#import "CalculatorBrain.h"

@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *operandStack;
@end

@implementation CalculatorBrain

@synthesize operandStack = _operandStack;
@synthesize operandStackIsEmpty = _operandStackIsEmpty;
@synthesize operationIsPicked = _operationIsPicked;
@synthesize operation = _operation;

- (NSMutableArray *) operandStack {
    if (!_operandStack) {
        _operandStack =[[NSMutableArray alloc] init];
        _operandStackIsEmpty = YES;
        _operationIsPicked = NO;
    }
    return _operandStack;
}

- (void) resetStack {
    [self.operandStack removeAllObjects];
    self.operandStackIsEmpty = YES;
    self.operationIsPicked = NO;
}

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

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

- (double) performOperation : (NSString *) operation{

    double result = 0;
    double num2 = [self popOperand];
    double num1 = [self popOperand];
    if ([operation isEqualToString:@"+"])
        result = num2 + num1;
    else if ([operation isEqualToString:@"-"])
        result = num2 - num1;
    else if ([operation isEqualToString:@"*"] || [operation isEqualToString:@"x"])
        result = num2 * num1;
    else if ([operation isEqualToString:@"/"]){
        if (num2 == 0)
            [self resetStack];
        else 
            result = num2 / num1;
    }

    [self pushOperand:result];
    self.operationIsPicked = NO;

    return result;

}

@end
另外,我在控制台中打印显示的调试NSLog工作正常,但是计算器视图中的显示实际上没有更新(当我使用断点来减慢函数的速度时)


谢谢大家!

引用评论中的答案:


“完整错误表示我向“[self.brain equalpressed:]发送了无效参数”“。实际上,equalsPressed不接受任何参数,但当我将视图中的“=”按钮链接到其各自的方法时,我忘记指出该函数不接受任何参数。因此,尽管我编写的函数没有参数,但我告诉编译器(首先)它应该接受一个参数。“

发布整个错误消息。什么是无法识别的选择器?您使用的是故事板还是.xib?您的应用程序如何处理没有发件人参数的IBActions?没关系!我发现了错误!完整错误表示我向“[self.brain equalpressed:]”发送了无效参数。实际上,equalsPressed不接受任何参数,但当我将视图中的“=”按钮链接到其各自的方法时,我忘记指出该函数不接受任何参数。因此,尽管我编写的函数没有参数,但我告诉编译器(首先)它应该接受一个参数。这就是为什么错误指向errorPressed,并在后面加上“:”。我通过创建一个新的“=”按钮并确保未选择任何参数来修复错误。此外,我使用的是故事板,MateUrProgrammer接近问题的根源。非常感谢。
#import "CalculatorViewController.h"
#import "CalculatorBrain.h"


@interface CalculatorViewController ()

@property (nonatomic) BOOL userIsInTheMiddleOfTypingANumber;
@property (nonatomic, strong) CalculatorBrain *brain;

@end


@implementation CalculatorViewController

@synthesize userIsInTheMiddleOfTypingANumber = _userIsInTheMiddleOfTypingANumber;
@synthesize brain = _brain;
@synthesize display = _display;

- (CalculatorBrain *) brain {

    if (!_brain) {
        _brain =[[CalculatorBrain alloc] init];
    }
    return _brain;

}

- (IBAction) digitPressed: (UIButton *)sender {

    NSString *digit = [sender currentTitle];
    if (self.userIsInTheMiddleOfTypingANumber)
        self.display.text = [self.display.text stringByAppendingString: digit];
    else {
        self.display.text = digit;
        self.userIsInTheMiddleOfTypingANumber = YES;
    }

}

- (IBAction) clearPressed {
    self.userIsInTheMiddleOfTypingANumber = NO;
    self.display.text = @"0";
    [self.brain resetStack];
}   


- (IBAction) equalsPressed {
    self.userIsInTheMiddleOfTypingANumber = NO;
    if (self.brain.operationIsPicked) {
        [self.brain pushOperand: [self.display.text doubleValue]]; 
        double result = [self.brain performOperation: self.brain.operation];
        self.display.text = [NSString stringWithFormat: @"%g", result];
        NSLog(@"%@",self.display.text);
    }
    NSLog(@"%@",self.display.text);
}

- (IBAction) operationPressed:(UIButton *) sender {

    if (self.userIsInTheMiddleOfTypingANumber) { 
        [self.brain pushOperand: [self.display.text doubleValue]]; 
        self.brain.operation = [sender currentTitle];
        self.brain.operationIsPicked = YES;
        self.userIsInTheMiddleOfTypingANumber = NO;
        NSLog(@"%@", sender.currentTitle);
    }
}