2012-09-17 12 views
43

Ich versuche herauszufinden, warum ich diesen Absturz in meiner App bekommen.EXC_BAD_ACCESS Code 2 auf UIAlertView in iOS6

Es funktioniert völlig in Ordnung in Xcode 4.4 mit iOS5.1 im Simulator ausgeführt wird, aber wenn ich in Xcode Schalter 4.5 und iOS6 Ich erhalte eine EXC_BAD_ACCESS Code 2. Hier ist mein Code:

- (void) myMethod 
{ 
    UIAlertView *alertview = [[[UIAlertView alloc]initWithTitle:@"Title" message:@"message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease]; 
    alertview.tag = 1 
    [alertview show]; 
} 

das gibt mir einen EXC_BAD_ACCESS Code 2 auf der [UIAlertView show] Linie

irgendwelche Ideen?

danke!

Antwort

126

Ich habe es. Ich habe das gleiche Problem, in meinem Fall scheint es, dass die Methode jetzt aus dem Hintergrund geworfen wird (jetzt in ios7, in ios6 UIAlertView wurde automatisch in den Haupt-Thread als @nodepond sagt -Danke! -) ..

versuchen, um sicherzustellen, dass das Verfahren von Haupt-Thread angezeigt:

[alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; 

Viel Glück!

+4

schön Debugging-Fähigkeiten! Definitiv gearbeitet –

+3

Ich möchte nur hinzufügen, dass dieser Absturz auch passiert, wenn die App gestartet wird, wenn der Benutzer nach Hause geht und zurückkommt, wird eine Warnanzeige zu einem Absturz führen. Mit performSelectorOnMainThread ... wird das Problem behoben, wie von Eva vorgeschlagen. – Tommy

+0

Großartig! Das hat mir geholfen und mein Problem gelöst! – Patrik

0

Es ist mir passiert, auch im Jahr 2014. Das Problem ist, wollen ein Objekt bereits freigegeben verwenden.

Was ich falsch gemacht haben:

//class B with UIAletViewDelegate 

-(void) showAlert{ 
UIAlertView * alert = [[UIAlertView alloc] initWithTitle bla bla...]; 
[alert show]; 
} 


//class A 
viewDidLoad{ 
MyClassB *B = [[B alloc] init]; 
[B showAlert]; 
} 

Was ist der richtige Weg:

//Class A 
@implementation A{ 
    ClassB *B; 
} 

viewDidLoad{ 
    B = [[B alloc] init]; 
    [B showAlert]; 
}