2

在用户单击 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 (code=1, address=0x7269634f) 任何帮助将不胜感激。谢谢!

4

3 回答 3

3

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

于 2012-11-16T03:42:03.220 回答
3

由于此代码,崩溃正在发生。[self release];. 当您调用self release显示警报的视图时,将释放和解除分配,而不是警报视图。这就是崩溃的原因。

您已经在使用dialButtonPressed:方法中释放了 alertViews 内存[message autorelease];

所以不需要在clickedButtonAtIndex. 所以改变方法,如:

- (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;
}
于 2012-11-16T03:56:53.317 回答
2

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

另一个问题是您尝试message.tag在设置messagenil. 调用对象的tag属性nil将始终导致值为 0。

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

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

于 2012-11-16T03:51:48.013 回答