0

アプリでEXC_BAD_ACCESSエラーが発生しました。または、私のクラスの1つでより具体的にします。カスタムUIAlertViewクラスです。EXC_BAD_ACCESSが使用中にスローされたときにキャッチできませんでした。時々それは期待通りにうまく機能します、そしてすべての突然でそれは割れます...ここにクラス全体があります

@implementation AlertPassword
int counter = 3;
@synthesize done;
@synthesize alertText;
@synthesize msg;
- (void) showAlert :(NSString*) title
{
    if(counter != 3){
        if(counter == 1)
        {
            NSString *msgs = @"Last warning";
            msg = msgs;
        }
        else
        {
            NSString *msgs = [NSString stringWithFormat:@"WRONG PIN. %d times remaining",counter];
            msg = msgs;

        }
    }
    else
    {
        NSString *msgs = @"Enter your pin";
        msg = msgs;
    }
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Security" message:msg delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil];
    _alert = alert;
    _alert.alertViewStyle = UIAlertViewStyleSecureTextInput;
    alertText = [_alert textFieldAtIndex:0];
    alertText.keyboardType = UIKeyboardTypeNumberPad;
    alertText.placeholder = @"Pin";
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controlTextDidChange:)
                                                 name:UITextFieldTextDidChangeNotification object:alertText];
    [_alert show];
    [_alert release];
    [[NSNotificationCenter defaultCenter] removeObserver:UITextFieldTextDidChangeNotification];
}


- (void)controlTextDidChange:(NSNotification *)notification {
    {
        NSString *pin = [[NSUserDefaults standardUserDefaults] stringForKey:@"Pin"];
        if ([notification object] == alertText)
        {
            if (alertText.text.length == pin.length)
            {
                if(counter != 0)
                {

                    if([alertText.text isEqualToString:pin])
                    {
                            [_alert dismissWithClickedButtonIndex:0 animated:NO];
                            [self.tableViewController openSettings];
                            counter = 3;
                    }
                    else
                    {
                            counter--;
                            [_alert dismissWithClickedButtonIndex:0 animated:NO];
                            [self showAlert:@""];

                    }
                }
                else
                {
                    [_alert dismissWithClickedButtonIndex:0 animated:NO];
                    [[NSUserDefaults standardUserDefaults] setObject:NULL
                                                              forKey:@"Telephone"];
                    [[NSUserDefaults standardUserDefaults] setObject:NULL
                                                              forKey:@"Pin"];
                    [[NSUserDefaults standardUserDefaults] synchronize];
                    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"" message:AMLocalizedString(@"EraseData", nil) delegate:nil cancelButtonTitle:AMLocalizedString(@"Ok", nil) otherButtonTitles:nil];
                    counter = 3;
                    [av show];
                    [av release];
                }

            }
        }
    }

}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *pincheck = [[NSUserDefaults standardUserDefaults] stringForKey:@"pinCheck"];
    if (buttonIndex == 0)
    {
        if(pincheck.intValue == 1)
        {
           NSLog(@"app kill");
            exit(0);
        }
        else
        {
            NSLog(@"dismiss");
        }
    }

}
@end

ここで、このクラスを初期化して使用します。

            case 5:
            NSLog(@"Add remove");
            if (pincheck != NULL && pin != NULL){
                if([pincheck isEqualToString:@"0"])
                {

                    AlertPassword *alert = [AlertPassword alloc];
                    alert.tableViewController = self;
                    NSString *msg = @"Enter your pin code to access:";
                    [alert showAlert:msg];
                //    [alert release];

                }
                break;
            }
            else
            {
                NSLog(@"Is null");
                [Menu load2View:self];
            }
            break;

アラートを出さなかったからかもしれませんが。ただし[alert release];、ユーザーが何かを入力しようとした直後にEXC_BAD_ACCESSを持つようにMadeを追加します。それなし[alert release];で動作します。しかし時々それはEXC_BAD_ACCESSでひび割れます

また時々それは得る

2012-11-08 12:11:27.451 kodinisRaktas[2485:19d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ dismissWithClickedButtonIndex:animated:]: unrecognized selector sent to instance 0x947aae0'

しかし、なぜこれが起こったのかもわかりません

助けてください、私はobjective-cとiosにかなり慣れていません、そしてこれを取り除く方法がわかりません、私は少し経験のある人が私のコードの何が悪いのかわかると思います。

キャンセルを4〜5回以上押してから何かを入力しようとすると、EXC_BAD_ACCESSまたは認識されないセレクターがスローされることを確認しました。

4

4 に答える 4

1

EXC_BAD_ACCESS は、主に不適切なメモリ処理が原因です。アラートはゾンビになった可能性が最も高いです...私はアラートをstrong/retainのプロパティとして持っています。表示中は、それを保持する必要があります。「ショー」の後にリリースされません。

最初にセットアップすると、このようにすることができます

_alert = [[UIAlertView alloc] initWithTitle:@"Security" message:msg delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil]; // retain count: 1

「show」を呼び出しても保持されることに注意してください。ただし、必要があるという事実は変わりません。

[_alert show]; // retain count: 2

デリゲート コールバックを待ってから解放します。

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    [_alert release], _alert = nil; // retain count in next run will be 0
}

Tip: UIAlertView をブロックと組み合わせて使うと扱いやすいかもしれません。http://gkoreman.com/blog/2011/02/15/uialertview-with-blocks/

于 2012-11-08T10:14:45.317 に答える
0

この「dismissWithClickedButtonIndex:animated:」メソッドに間違った値を渡している可能性があります。値の署名を認識していないため、再確認してください。

于 2012-11-08T10:26:08.723 に答える
0

アラートを初期化する場所がわかりません。とにかく、それはクラスフィールドだと思うので、保持してください。クラスインスタンス変数でない場合は、そうしてください。このようにして、常にそれへのポインターがあります。

[__NSMallocBlock__ dismissWithClickedButtonIndex:animated:]

このメッセージを未加工の malloc ブロックに送信しているため、おそらくアラートが解放され、objc オブジェクトではない何かに使用されているメモリを指しています。
警戒を怠らず、何が起こるか見てみましょう。

于 2012-11-08T10:20:28.433 に答える
0

例外的な答えは理にかなっていて、おそらく原因です

しかし、これは何ですか?[NSNotificationCenter defaultCenter] removeObserver:UITextFieldTextDidChangeNotification];

于 2012-11-08T18:33:02.267 に答える