0

我是 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
4

2 回答 2

2

好吧,您可能不想只将字符串转换为整数 (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

于 2010-06-03T02:53:20.587 回答
0

在您的格式字符串中,您正在执行以下操作:

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

但根据你的@interface,ans是一个整数。因此该行应为:

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

因为%d是整数的格式说明符。

于 2010-06-03T05:06:06.223 回答