我是iphone app世界的新手。所以我想我用计算器应用程序试试运气。 不幸的是我遇到了一个问题,如果我按下计算器中的第三个键,应用程序崩溃了。有时我得到这个错误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
答案 0 :(得分: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
答案 1 :(得分:0)
在您的格式字符串中,您正在执行此操作:
newText = [[NSString alloc] initWithFormat:@"%@", ans];
但根据您的@interface
,ans
是一个整数。所以该行应为:
newText = [[NSString alloc] initWithFormat:@"%d", ans];
因为%d
是整数的格式说明符。