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

このコードが原因でクラッシュが発生しています。[self release];. アラートが表示されているビューを呼び出すとself release、alertView ではなく、解放され、割り当てが解除されます。それがクラッシュの原因です。

dialButtonPressed:を使用してメソッドでalertViewsメモリをすでに解放しています[message autorelease];

そのため、で alertView を再度リリースする必要はありません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 に答える
3

問題は、if ステートメントの前にアラートを nil に設定している可能性があります。後に入れてみてください。

于 2012-11-16T03:42:03.220 に答える
2

クラッシュの原因は、メモリ管理が不十分なためです。主な問題はを呼び出すこと[self release]です。これが適切であるのは非常にまれなケースです。

もう1つの問題は、に設定したmessage.tag直後にチェックしようとすることです。オブジェクトのプロパティを呼び出すと、値は常に0になります。messageniltagnil

あなたのdeallocメソッドはすべて間違っています。電話しないでください[self release][message release]見せたときに自動リリースしたので電話しないでください。

ところでtag、0を使用しないでください。これがデフォルトです。を使用する場合はtag、値をデフォルトと区別できるように、常にゼロ以外の値を使用してください。

于 2012-11-16T03:51:48.013 に答える