changey
changey

Reputation: 19576

The iOS app crashed right after clicking the button on a UIAlertview

I tried to dial a number with the phone app after the user click on a button on a UIAlertview. The phone app did open, but the original app crashed right after clicking the button on the UIAlertview. Does anyone one know the reason? I did try to make sure I released everything that should be released. Thanks! Below is the code:

-(IBAction)dialButtonPressed:(UIButton *)numberButton
    {
    if ([company isEqualToString:@"Not Found"]==true){
            message = [[UIAlertView alloc] initWithTitle:@"Sorry"
                                                              message:@"No replace number found. Would you like to dial anyway?"
                                                             delegate:self
                                                    cancelButtonTitle:@"No"
                                                    otherButtonTitles:@"Yes", nil];
            message.tag = 0;
            if(phoneLinkString)
            {
                [phoneLinkString release];
                phoneLinkString = nil;
            }
            [message show];
            [message autorelease];
            phoneLinkString = [[NSString stringWithFormat:@"tel:%@",replace]retain];


        }
    }

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
        [self release];

        message = nil;


        if(message.tag == 0 && buttonIndex == 1){
            NSURL *phoneLinkURL = [NSURL URLWithString:phoneLinkString];
            [[UIApplication sharedApplication] openURL:phoneLinkURL];
        }

- (void)dealloc {
    [phoneNumberString release];
    [phoneNumberLabel release];
    [self release];
    [message release];
    [super dealloc];
}

The newest code

    -(IBAction)dialButtonPressed:(UIButton *)numberButton
            {
            if ([company isEqualToString:@"Not Found"]==true){
                    message = [[UIAlertView alloc] initWithTitle:@"Sorry"
                                                                      message:@"No replace number found. Would you like to dial anyway?"
                                                                     delegate:self
                                                            cancelButtonTitle:@"No"
                                                            otherButtonTitles:@"Yes", nil];
                    message.tag = 1;
                    if(phoneLinkString)
                    {
                        [phoneLinkString release];
                        phoneLinkString = nil;
                    }
                    [message show];
                    [message autorelease];
                    phoneLinkString = [[NSString stringWithFormat:@"tel:%@",replace]retain];


                }
        }
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
        {

            if(message.tag == 1 && buttonIndex == 1){

                NSURL *phoneLinkURL = [NSURL URLWithString:phoneLinkString];
                [[UIApplication sharedApplication] openURL:phoneLinkURL];
                message = nil;
            }
        }
- (void)dealloc {
            [phoneNumberString release];
            [phoneNumberLabel release];
            [super dealloc];
        }

but it still crashed after clicking the button on the UIAlertview. The error is 0x3beb85b0: ldr r3, [r4, #8] EXC_BAD_ACCESS (code=1, address=0x7269634f) Any help would be appreciated. Thanks!

Upvotes: 2

Views: 634

Answers (3)

Midhun MP
Midhun MP

Reputation: 107121

The crash is happening due to this code. [self release];. When you call self release the view in which the alert is displayed will released and deallocated, not the alertView. That's the cause of crash.

You are already releasing the alertViews memory in the dialButtonPressed: method using [message autorelease];

So no need to release the alertView again in clickedButtonAtIndex. So change the method like:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if(alertView.tag == 0 && buttonIndex == 1)
    {
        NSURL *phoneLinkURL = [NSURL URLWithString:phoneLinkString];
        [[UIApplication sharedApplication] openURL:phoneLinkURL];
    }
    message = nil;
}

Upvotes: 3

rmaddy
rmaddy

Reputation: 318794

Your crash is being caused by poor memory management. The primary issue is calling [self release]. It's a pretty rare case that this is appropriate.

Another issue is your attempt to check the message.tag right after setting message to nil. Calling the tag property on a nil object will always result in a value of 0.

Your dealloc method is all wrong. Don't call [self release]. Don't call [message release] since you autoreleased it when you showed it.

BTW - never use a tag of 0. This is the default. If you want to use the tag, always use a non-zero value so you can distinguish the value from the default.

Upvotes: 2

Alex
Alex

Reputation: 449

The problem might be that you set your alert to nil before your if statement. Try putting it after.

Upvotes: 3

Related Questions