iOS应用程序在单击UIAlertview上的按钮后立即崩溃

时间:2012-11-16 03:34:28

标签: objective-c ios

用户点击UIAlertview上的按钮后,我尝试使用手机应用程序拨号。手机应用程序确实打开了,但是原始应用程序在点击UIAlertview上的按钮后立即崩溃。有人知道原因吗?我确实尝试确保发布了应该发布的所有内容。谢谢!以下是代码:

-(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];
}

最新代码

    -(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];
        }

但是在点击UIAlertview上的按钮后它仍然崩溃了。错误是0x3beb85b0:ldr r3,[r4,#8] EXC_BAD_ACCESS(代码= 1,地址= 0x7269634f)任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:3)

问题可能是您在if语句之前将警报设置为nil。试着把它放在后面。

答案 1 :(得分:3)

由于此代码,崩溃正在发生。 [self release];。 当您致电self release时,显示警报的视图将被释放并取消分配,而不是alertView。这是崩溃的原因。

您已使用dialButtonPressed:

[message autorelease];方法中发布alertViews内存

因此无需在clickedButtonAtIndex中再次发布alertView。所以改变方法如:

- (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;
}

答案 2 :(得分:2)

您的崩溃是由内存管理不善引起的。主要问题是调用[self release]。这是一个非常罕见的情况,这是合适的。

另一个问题是,您在message.tag设置为message后尝试检查nil。在tag对象上调用nil属性将始终生成值0.

你的dealloc方法都错了。不要致电[self release]。不要打电话给[message release],因为你在展示它时会自动释放它。

顺便说一句 - 从不使用0的tag。这是默认值。如果要使用tag,请始终使用非零值,以便将值与默认值区分开来。