2010-11-23 17 views
1

Ich verstehe nicht, warum dies mir eine EXC_BAD_ACCESS gibt. Grundlegender Hintergrund, ich sammle und verarbeite einige Informationen und benutze dann eine modale Ansicht, um den Benutzer bestätigen zu lassen, ob er fortfahren möchte.Iphone UIAlertView wirft EXC_BAD_ACCESS. - Bearbeitet, nicht verursacht durch UIAlertView

Ich habe eine Schaltfläche in der Navigationsleiste namens continue, die meine Daten vorbereitete Funktion aufruft.

- (void)viewDidLoad { 
    //Other stuff 
    UIBarButtonItem *next = [[UIBarButtonItem alloc] 
            initWithTitle:@"Next" 
            style:UIBarButtonItemStyleBordered 
            target:self 
            action:@selector(prepData)]; 
    self.navigationItem.rightBarButtonItem = next; 
    [next release]; 
    [super viewDidLoad]; 
} 

prepDATA:

-(void)prepData{ 
    /* 
    There's a bunch of stuff going on here, if "mensaje" is not an empty NSString, there is some kind of error that wont let me go on, if not, everything in the data is fine 
    */ 
    if(![mensaje isEqualToString:@""]){ 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle:nil 
           message:mensaje 
           delegate:nil 
           cancelButtonTitle:@"Aceptar" 
           otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    }else{ 
     UIActionSheet *actionSheet = [[UIActionSheet alloc] 
             initWithTitle:@"¿Esta seguro que desea realizar estas operaciones?" 
             delegate:self 
             cancelButtonTitle:@"Cancelar" 
             destructiveButtonTitle:@"Aceptar" 
             otherButtonTitles:nil]; 
     [actionSheet showInView:self.view]; 
     [actionSheet release]; 
    } 
} 

Wenn ich debuggen, kann ich den ganzen Weg durch die prepDATA() erhalten, sobald ich weiter drücke ich ein EXC_BAD_ACCESS bekommen. Wenn ich die [actionSheet-Version] auskommentiere; Ich bekomme die Ausnahme nicht, aber es ist meines Wissens so, dass genau wie bei Alarmsichten Action-Sheets "bleiben", bis sie auftauchen.

Zumindest sagen alle Bücher, die ich gelesen habe, aber es ist durchaus möglich, dass ich etwas in der Autoreleasing nicht verstehe.

Nur als Referenz erscheint die Warnung ganz gut.

Hat jemand eine Idee, was hier los ist?

Danke, Stefano.

Bearbeiten: Es stellte sich heraus, dass der obige Code für Aktionen Blätter und Warnungsansichten in Ordnung ist, war das Problem, dass ich etwas veröffentlicht, das später versucht wurde, Autoreleased.

I for-Schleife haben, tut dies:

for(someConditions){ 
    NSString *montoFormateado = [[[NSString alloc] initWithFormat:@"%.2lf",[monto doubleValue]] stringByReplacingOccurrencesOfString:@"." withString:@","]; 
        [_postBuild setObject:[NSString stringWithString:montoFormateado] forKey:[NSString stringWithString:iidvar]]; 
        [montoFormateado release]; 
}        
postBuild = [_postBuild mutableCopy]; 
[_postBuild release]; 

Nun scheint es, die Fehler in der Tatsache, dass bei Einsatz von [NSString strintWithString: montoFormateado] Ich für Autofreigabe diese Zeichenfolge bis verließ später, aber wenn Ich habe _postBuild freigegeben, dass der String auch veröffentlicht wurde, ich habe das entfernt und einfach setObject: montoFormateado verwendet und es funktioniert gut.

Seine undichte Speicher, aber ich denke, das ist für eine andere Frage, die exc_bad_access wurde gelöst.

+0

sehr kleine Sache, aber im Allgemeinen denke ich, es ist eine bessere Idee, [Super ViewDidLoad] vor dem Ausführen von Änderungen aufzurufen, nicht am Ende der Methode. Die einzige Zeit, die Sie [Super xxx] am Ende einer Methode setzen möchten, ist, wenn Sie dealloc aufrufen. – makdad

+0

Danke für den Tipp, das ändern. Lass mich mit Zombies versuchen, um zu sehen, ob ich etwas bekomme. – blindstuff

+0

Das Problem liegt höchstwahrscheinlich in dem Code, den Sie weggelassen haben - vielleicht wird Mensaje zu oft freigegeben (d. H. Eine automatisch freigegebene Zeichenfolge wird freigegeben). – Eiko

Antwort

4

Der einfachste Weg, um diese Art von Fehler zu finden, ist die Verwendung der Umgebungsvariablen NSZombieEnabled.

Wenn Sie am Ende eines Aufrufs eine EXC_BAD_ACCESS erhalten, bedeutet dies normalerweise, dass etwas automatisch freigegeben wird, aber es ist bereits 0, wenn Sie es freigeben.

Überprüfen Sie this post, es wird Ihr Leben eine Menge Zeit retten. Wenn das nicht funktioniert, hinterlasse einen Kommentar und wir setzen unsere Debugging-Kappen wieder auf :)

+0

Akzeptiert, weil ich NSZombiesEnabled verwendet habe, um es zu lösen, aber sowohl diese als auch Stephens Antworten sind richtig. – blindstuff

-1

Sie die Freigabe der UIAlertView Vielleicht vor seiner verwendet, versuchen Sie die Freigabeerklärung zu entfernen und die UIAlertView als Auto Release erklären (obwohl es die Art und Weise haben Sie es in Ordnung sein sollte)

if(![mensaje isEqualToString:@""]){ 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle:nil 
           message:mensaje 
           delegate:nil 
           cancelButtonTitle:@"Aceptar" 
           otherButtonTitles:nil] autorelease]; 
     [alert show]; 

Eine andere Sache, es könnte Sei das, dass du diese Typen wieder frei gibst, wenn du etwas zurückruft oder so, du solltest überprüfen, ob du das nicht tust, und wie das Poster über mir sagte, kannst du Zombies benutzen, um diese Dinge auch herauszufinden.

+0

Ich glaube, seine Veröffentlichung des UIAlertView ist in Ordnung. Die Apple Beispielprojekte, die ich gesehen habe, verwenden die folgenden Schritte, um eine Alarmansicht anzuzeigen: 1. Zuweisen der UIAlertView, 2. Anzeigen der UIAlertView, 3. Freigeben der UIAlertView (alle im selben Bereich). Die Projektbeispiele von Apple I haben gezeigt, dass UIActionSheets nach dem Aufruf von showInView auch das Action Sheet freigibt. –

+0

-1 allok/show/release ist die richtige Reihenfolge. – Eiko

-1

In beiden Fällen, wenn du "release" wirst, solltest du zuerst besser "behalten".

Im Fall der UIActionSheet - Ich glaube, die in showInView übergebene Ansicht behält eine Kopie des Action Sheet.

In der AlertView ist dies nicht der Fall.

+0

-1 allok/show/release ist die richtige Reihenfolge. – Eiko

1

Ich denke, es gibt eine Version zu viele im Code, die Sie nicht gezeigt haben (in der "Es gibt eine Menge Dinge hier los, wenn" Mensaje "ist kein leerer NSString" Block).

Es ist nichts falsch mit Ihrem ActionSheet-Code. Wie du sagst, sollte es sich selbst entziehen, sobald es nicht mehr auf dem Bildschirm ist. Wenn Sie jedoch eine der Unteransichten von self.view zu viel freigegeben haben, kann dies zu einem Absturz führen, wenn der Pool für die automatische Freigabe leer ist.