0

私はiPhoneアプリの世界の初心者です。そこで、電卓アプリで運試しをしようと思いました。残念ながら、電卓で 3 番目のキーを押すとアプリがクラッシュするという問題が発生しています。時々、このエラー 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_digitintegerValue]を使用します。

何が起こっているのかというと、big_digitプロパティが保持されていないということです。この行では、自動解放される文字列を割り当てるだけです。

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

次のパススルーでは、big_digitは!= nilですが、big_digitが無効なメモリ位置を指しているため、[big_digit isEqualToString:@ "0"]==FALSEは失敗します。

あなたがしたいのは、big_digitをインターフェースのプロパティにすることです...

@property (nonatomic, retain) NSMutableString *big_digit;

ドキュメントを読むのは面倒ですが、コードを見ると、これを読むと本当に便利だと思います。Objective 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];

しかし、あなたによると@interfaceansは整数です。したがって、その行は次のようになります。

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

since%dは整数のフォーマット指定子です。

于 2010-06-03T05:06:06.223 に答える