开发者

"Program received signal "SIGABRT" when building a calculator

(I'm beginner.) I'm practicing Navigation Cont开发者_运维问答roller. I try to implement a simple calculator.

I ran the code in simulator. After I pressed any button which was linked to "addFunction", "substractFunction", "multiplyFunction" or "divideFunction", It crashed.

The debugger marked the following code in main.m

int retVal = UIApplicationMain(argc, argv, nil, nil);

and said "Thread 1: Program received signal: "SIGABRT"."

Does anyone know how to cope with this situation? Thanks.

Here's the code:

ChangeAppView.h:

#import <UIKit/UIKit.h>
@class ChangeViewController;
@interface ChangeAppDelegate : NSObject <UIApplicationDelegate>
{
    UIWindow *window;
    UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) UINavigationController *navigationController;
@end

ChangeAppDelegate.m:

#import "ChangeAppDelegate.h"
#import "ChangeViewController.h"

@implementation ChangeAppDelegate
@synthesize window;
@synthesize navigationController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    navigationController = [[UINavigationController alloc] init]; 
    self.window.rootViewController = navigationController; 
    ChangeViewController *changeViewController = [[ChangeViewController alloc] initWithNibName:@"ChangeViewController" bundle:nil]; 
    [navigationController pushViewController:changeViewController animated:YES];
    [changeViewController release];
    [self.window makeKeyAndVisible]; 
    return YES;
}

- (void)dealloc
{
    [navigationController release];
    [window release];
    [super dealloc];
}
@end

CalculatorViewController.h:

#import <UIKit/UIKit.h>
@interface CalculatorViewController : UIViewController 
{
    IBOutlet UITextField *numberField1;
    IBOutlet UITextField *numberField2;
    IBOutlet UILabel *resultLabel;
}
@property (nonatomic , retain) IBOutlet UITextField *numberField1;
@property (nonatomic , retain) IBOutlet UITextField *numberField2;
@property (nonatomic , retain) IBOutlet UILabel *resultLabel;
-(IBAction)addFunction:(id)sender;
-(IBAction)substractFunction:(id)sender;
-(IBAction)multiplyFunction:(id)sender;
-(IBAction)divideFunction:(id)sender;
-(IBAction)clear:(id)sender;
-(IBAction)backgroundTap:(id)sender;
@end

CalculatorViewController.m:

#import "CalculatorViewController.h"
@implementation CalculatorViewController
@synthesize numberField1;
@synthesize numberField2;
@synthesize resultLabel;
-(IBAction)addFunction:(id)sender
{
    float a = ([numberField1.text floatValue]);
    float b = ([numberField2.text floatValue]);    
    resultLabel.text = [NSString stringWithFormat:@"%2.f" , a+b];
}

-(IBAction)substractFunction:(id)sender
{
    float a = ([numberField1.text floatValue]);
    float b = ([numberField2.text floatValue]);
    NSString *result = [[NSString alloc] initWithFormat:@"%2.f" , a-b];
    resultLabel.text = result;
    [result release];
}

-(IBAction)multiplyFunction:(id)sender
{
    float a = ([numberField1.text floatValue]);
    float b = ([numberField2.text floatValue]);
    resultLabel.text = [[NSString alloc] initWithFormat:@"%2.f" , a*b];
}

-(IBAction)divideFunction:(id)sender
{
    float a = ([numberField1.text floatValue]);
    float b = ([numberField2.text floatValue]);
    resultLabel.text = [[NSString alloc] initWithFormat:@"%2.3f" , a/b];
}

-(IBAction)clear:(id)sender
{
    numberField1.text = @"";
    numberField2.text = @"";
    resultLabel.text = @"";
}

-(IBAction)backgroundTap:(id)sender
{
    [numberField1 resignFirstResponder];
    [numberField2 resignFirstResponder];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    // Custom initialization
    }
    return self;
}

- (void)dealloc
{
    [numberField1 release];
    [numberField2 release];
    [resultLabel release];
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];  
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle
- (void)viewDidLoad
{
    self.title = @"Calculator";
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end


From the exception above, it seems that your IBActions are not properly connected. As dasdom mentioned, delete all your buttons, create new buttons and then add IBAction methods accordingly.

Also one more thing i recognized in your code, in the multiply and divide methods there is a memory leak.You have written

resultLabel.text = [[NSString alloc] initWithFormat:@"%2.f" , a*b];

it should be

resultLabel.text = [[[NSString alloc] initWithFormat:@"%2.f" , a*b]autorelease]; 

or

resultLabel.text = [NSString StringWithFormat:@"%2.f" , a*b];

and do a similar change in divide method also.

To what did you link your backgroundtap method?


It seems that you buttons aren't buttons. They seem to be view. Delete the buttons from you nib and put new buttons there and link them you our IBActions.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜