7 Stimmen

UIAlertView stürzt bei undokumentierter Methode ab

Unsere App stürzt mit einer Häufigkeit von etwa 1 von 1.500 Starts aufgrund eines Fehlers ab, der sich als schwer fassbar erweist. Der relevante Teil des Stack Trace ist beigefügt. Es wird als Callback abgefeuert, so dass ich keinen Hinweis darauf habe, wo es in meinem eigenen Code auftritt.

Es sieht so aus, als gäbe es eine UIViewAnimationState Objekt, das aufruft UIAlertView's private Methode ( _popoutAnimationDidStop:finished: ). Das einzige Problem ist, dass es scheint, dass die UIAlertView ist zu diesem Zeitpunkt bereits freigegeben worden. Ich tue nichts Seltsames mit Alert Views. Ich zeige sie an und warte auf Benutzereingaben. Sie werden alle angezeigt, bevor sie freigegeben werden.

Hat jemand Erfahrung mit diesem Problem? Im Moment neige ich dazu, dass es ein Apple-Fehler ist.

Thread 0 Crashed:
0   libobjc.A.dylib                 0x3138cec0 objc_msgSend + 24
1   UIKit                           0x326258c4 -[UIAlertView(Private) _popoutAnimationDidStop:finished:]
2   UIKit                           0x324fad70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3   UIKit                           0x324fac08 -[UIViewAnimationState animationDidStop:finished:]
4   QuartzCore                      0x311db05c run_animation_cal

lbacks

0 Stimmen

Erinnern Sie sich an den Fehler, der im Debugger angezeigt wurde? [* respondsToSelector:]: Nachricht an deallocated instance gesendet

12voto

cduhn Punkte 17688

Es ist wahrscheinlich, dass UIAlertView versucht, eine Methode auf seinem Delegaten aufzurufen, nachdem der Delegat freigegeben wurde. Um diese Art von Fehler zu verhindern, setzen Sie jedes Mal, wenn Sie ein Objekt als Delegat eines anderen Objekts festlegen, die Delegate-Eigenschaft in der Dealloc-Methode des Delegate-Objekts auf null. z.B.

@implementation YourViewController
@synthesize yourAlertView;

- (void)dealloc {
    yourAlertView.delegate = nil; // Ensures subsequent delegate method calls won't crash
    self.yourAlertView = nil; // Releases if @property (retain)
    [super dealloc];
}

- (IBAction)someAction {
    self.yourAlertView = [[[UIAlertView alloc] initWithTitle:@"Pushed"
                         message:@"You pushed a button"
                         delegate:self
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil] autorelease];
    [self.yourAlertView show];
}

// ...

@end

1 Stimmen

Perfekter Dank. Offensichtliche Lösung, ich habe nur auf die Annahme, dass es die UIAlertView war irgendwie vorzeitig freigegeben wurde aufgehängt. Manchmal muss man einfach eine andere Gruppe von Augen darauf bekommen. Für alle anderen, die auf dieses Problem stoßen, sollten Sie wissen, dass Sie, wenn Sie einen Navigationsstapel verwenden, der nicht-deterministisch gepusht/gepoppt werden kann (z. B. bei einem Verbindungsverlust), immer alle Delegaten in Ihrem dealloc zurücksetzen müssen. Apple veranschaulicht dieses Muster in seinen Beispielprojekten NICHT richtig.

3 Stimmen

Ich bin mit dem gleichen Problem konfrontiert, könnte jemand darauf hinweisen, wie dies zu beheben, wenn AlertView als lokale Variable deklariert. Müssen wir den Delegaten auf null auf den Delegaten-Callback setzen?

0 Stimmen

Interessant ist, dass dies sogar bei Anwendungen passiert, die im ARC-Modus kompiliert wurden. Warum hat Apple die Delegate-Eigenschaft von UIAlertView nicht sicher schwach gemacht, wie sie es für alle delegate-ähnlichen Eigenschaften empfehlen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X