Я не могу понять, как решить ошибку SIGABRT в Xcode - PullRequest
0 голосов
/ 21 января 2012

Я работаю над базовым приложением калькулятора, следуя учебному пособию для класса iTunes U.Я думал, что сработал отлично, но когда я запускаю приложение в симуляторе, я получаю неожиданную ошибку.Калькулятор работает, вводя номер, нажимая кнопку ввода, вводя второе число, затем кнопку ввода и затем операцию.Это позволяет мне добавлять цифры для формирования многозначного числа, но как только я нажимаю «ввод», он выходит из системы и говорит: «Поток 1: Программа получила сигнал:« SIGABRT ».« Я дважды и трижды проверил свой код иКажется, я не могу найти что-то неправильное, поэтому я решил опубликовать все это здесь и посмотреть, сможете ли вы, ребята, понять это.Заранее спасибо!

CalculatorBrain.h

#import <Foundation/Foundation.h>

@interface CalculatorBrain : NSObject

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


@end

CalculatorBrain.m

#import "CalculatorBrain.h"

@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *operandStack;
@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];
}

- (double)performOperation:(NSString *)operation
{
    double result = 0;

    if ([operation isEqualToString:@"+"]){
        result = [self popOperand] + [self popOperand];
    } else if ([@"*" isEqualToString:operation]) {
        result = [self popOperand] * [self popOperand];
    } else if ([operation isEqualToString:@"-"]) {
        double subtrahend = [self popOperand];
        result = [self popOperand] - subtrahend;
    } else if ([operation isEqualToString:@"/"]) {
        double divisor = [self popOperand];
        if (divisor) result = [self popOperand] / divisor;
    }

    [self pushOperand:result];

    return result;
}

@end

CalculatorViewController.h

#import <UIKit/UIKit.h>

@interface CalculatorViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *display;

@end

CalculatorViewController.m

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


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

@implementation CalculatorViewController

@synthesize display;
@synthesize userIsInTheMiddleOfEnteringANumber;
@synthesize brain = _brain;

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

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

    NSString *digit = [sender currentTitle];
    if (self.userIsInTheMiddleOfEnteringANumber) {
        self.display.text = [self.display.text stringByAppendingString:digit]; 
    } else {
        self.display.text = digit;
        self.userIsInTheMiddleOfEnteringANumber = YES;
    }
}
- (IBAction)enterPressed 
{
    [self.brain pushOperand:[self.display.text doubleValue]];
    self.userIsInTheMiddleOfEnteringANumber = NO;
}

- (IBAction)operationPressed:(UIButton *)sender 
{
    if (self.userIsInTheMiddleOfEnteringANumber) {
        [self enterPressed];
}
    NSString *operation = [sender currentTitle];
    double result = [self.brain performOperation:operation];
    self.display.text = [NSString stringWithFormat:@"%g", result];
}

@end

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Откройте файл CalculatorViewController.xib в Xcode и щелкните правой кнопкой мыши «Владелец файла».Проверьте появившееся всплывающее окно, если у вас есть какие-либо связанные свойства, которые не реализованы в файле CalculatorViewController.h (согласно приведенному выше коду, единственными свойствами, связанными из .xib и .h, должна быть UILabel, называемая «display».Удалите все недействительные связанные свойства, если они есть (недействительные связанные свойства будут отмечены желтым предупреждающим знаком).

0 голосов
/ 21 января 2012

Разверните исполняемый файл вашего проекта и щелкните по нему правой кнопкой мыши. и нажмите GetInfo-> Argument tag в конце окна, которое вы видите, кнопку со знаком плюс и минус, нажмите кнопку + сигнал и напишите

Name              Value
NSZombieEnabled   YES

затем после выполнения вашего проекта и всякий раз, когда происходит сбой вашего приложения, нажимаете на run munu-> console, и вы видите, почему происходит сбой вашего приложения. Пожалуйста, попробуйте это, может быть, это поможет вам.

...