开发者

Simple calculator app crashes when a third number key is punched

开发者 https://www.devze.com 2023-01-02 06:38 出处:网络
I am a newbie to the iphone app world. So I thought I try my luck with a calculator app. Unfortunately I am running into an issue where if I press a third key in the calculator the app crashes. Someti

I am a newbie to the iphone app world. So I thought I try my luck with a calculator app. Unfortunately I am running into an issue where if I press a third key in the calculator the app crashes. Sometimes I get this error EXC_BAD_ACCESS. Here is a code in my CalculatorViewController.m file.

#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];
  开发者_JS百科  }
    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];
}

Can anyone spot an obvious issue here. Here is the respective header file too.

#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


Well, you probably don't want to just cast a string to an integer (ala (int)big_digit). Instead you want to use [big_digit integerValue];

I think what is happening is that your big_digit property is not retained. In this line, you just assign a string to it that is autoreleased:

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

On the next pass through, big_digit is != nil, but [big_digit isEqualToString:@"0"] == FALSE fails because big_digit now points to an invalid memory location.

What you want to do is make big_digit a property in your interface, like so...

@property (nonatomic, retain) NSMutableString *big_digit;

I know reading docs sucks, but looking at your code I think you would really find reading through this useful. Memory management in objective c is quite a bit different from regular old C. http://developer.apple.com/iphone/library/documentation/cocoa/conceptual/memorymgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1


In your format strings, you're doing this:

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

But according to your @interface, ans is an integer. So that line should read:

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

since %d is the format specifier for an integer.

0

精彩评论

暂无评论...
验证码 换一张
取 消