Простое приложение калькулятор вылетает при нажатии третьей клавиши - PullRequest
0 голосов
/ 03 июня 2010

Я новичок в мире приложений для iphone. Так что я решил попытать счастья с приложением калькулятора. К сожалению, я сталкиваюсь с проблемой, когда при нажатии третьей клавиши в калькуляторе происходит сбой приложения. Иногда я получаю эту ошибку EXC_BAD_ACCESS. Вот код в моем файле CalculatorViewController.m.

#import "CalculatorViewController.h"

@implementation CalculatorViewController

@synthesize screenText;

- (IBAction)buttonPressed:(id)sender {
    NSString *title = [sender titleForState:UIControlStateNormal];
    [self collect:title];
}

- (void)collect:(NSString *)digitz {
    NSString * newText = nil;
    if ([digitz isEqualToString:@"+"]) {
        [self add:result];
        big_digit = nil;

    }
    else if ([digitz isEqualToString:@"+"]) {
        [self sub:result];
    }
    else if ([digitz isEqualToString:@"x"]) {
        [self multiply:result];     
    }
    else if ([digitz isEqualToString:@"="]) {
        [self equate:result];       
    }
    else {
        if (big_digit != nil && [big_digit isEqualToString:@"0"] == FALSE)
            big_digit = [big_digit stringByAppendingFormat:@"%@",digitz];
        else
            big_digit = (NSMutableString *) digitz;
        result = (int) big_digit;
        newText = [[NSString alloc] initWithFormat:
               @"%@",big_digit];    
    }

    screenText.text = newText;
    [newText release];  
}


- (void)add:(int)res {
    NSString * newText = nil;
    ans = ans + res;
    newText = [[NSString alloc] initWithFormat:
               @"%@",ans];

    screenText.text = newText;
    [newText release];
}

Может кто-нибудь заметить очевидную проблему здесь. Вот и соответствующий заголовочный файл.

#import <UIKit/UIKit.h>

@interface CalculatorViewController : UIViewController {
    UILabel *screenText;
    int number;
    int result;
    int ans;
    //NSString *big_digit;
    NSMutableString * big_digit ;
}
@property (nonatomic, retain) IBOutlet UILabel *screenText;
- (IBAction)buttonPressed:(id)sender;
- (void)collect:(NSString *)digitz;
- (void)add:(int)num;
- (void)sub:(int)num;
- (void)multiply:(int)num;
- (void)equate:(int)num;

@end

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Ну, вы, вероятно, не хотите просто приводить строку к целому числу (ala (int) big_digit). Вместо этого вы хотите использовать [big_digit integerValue];

Я думаю, что ваше свойство big_digit не сохраняется. В этой строке вы просто назначаете ей строку, которая автоматически высвобождается:

big_digit = [big_digit stringByAppendingFormat:@"%@",digitz];

При следующем проходе big_digit имеет значение! = Nil, но [big_digit isEqualToString: @ "0"] == FALSE завершается ошибкой, поскольку big_digit теперь указывает на недопустимое расположение в памяти.

То, что вы хотите сделать, это сделать big_digit свойством в вашем интерфейсе, например, так ...

@property (nonatomic, retain) NSMutableString *big_digit;

Я знаю, что чтение документов - отстой, но, глядя на ваш код, я думаю, что вы действительно найдете чтение этого полезным. Управление памятью в цели c немного отличается от обычного старого C. http://developer.apple.com/iphone/library/documentation/cocoa/conceptual/memorymgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1

0 голосов
/ 03 июня 2010

В ваших строках формата вы делаете это:

newText = [[NSString alloc] initWithFormat:@"%@", ans];

Но согласно вашему @interface, ans является целым числом. Так что строка должна выглядеть так:

newText = [[NSString alloc] initWithFormat:@"%d", ans];

, поскольку %d - это спецификатор формата для целого числа.

...