2010-05-19 7 views
5

Ich bin relativ neu in iPhone Entwicklung, so dass dies meine Schuld sein kann, aber es geht gegen das, was ich gesehen habe. :)UIAlertView -show verursacht ein Speicherleck

Ich denke, dass ich eine UIAlertView erstellen, die nur in diesem Vakuum der 'if' Aussage lebt.

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

if(!data) 
{ 
    // Add an alert 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                message:@"Unable to contact server" 
                delegate:nil 
              cancelButtonTitle:@"Ok" 
              otherButtonTitles:nil]; 
    NSLog(@"retain count before show: %i", alert.retainCount); 
    [alert show]; 
    NSLog(@"retain count before release: %i", alert.retainCount); 
    [alert release]; 
    NSLog(@"retain count after release: %i", alert.retainCount); 
    return nil; 
} 

Die Konsole protokolliert mich jedoch.

retain count before show: 1 
retain count before release: 6 
retain count after release: 5 

Ich habe auch versucht, und fügte hinzu:

alert = nil; 

nach der Veröffentlichung. Das bedeutet, dass der Retain-Wert 0 ist, aber ich zeige immer noch ein Leck. Und wenn es hilft, ist der Verantwortliche Rahmen des Lecks UIKeyboardInputManagerClassForInputMode. Ich benutze auch OS 4 Beta 3.

Also hat jemand irgendwelche Ideen, wie eine lokale UIAlertView die Anzahl zählen würde sich um 5 erhöhen, wenn Sie -show aufrufen?

Danke für Ihre Hilfe!

+0

Ich sehe das gleiche - mit der Release-Version von iOS 4.1. Die Veröffentlichung scheint nicht wichtig zu sein, und ich habe stattdessen Autorelease versucht - das gleiche. Das muss ein Fehler im Betriebssystem sein, oder? – Axeva

+0

Ich sehe das gleiche heute unter iOS 4.1, und danke für diese Frage. – AechoLiu

+0

aber wie ist es möglich, dieses Problem zu lösen? Ich bin in der gleichen Situation. nach der Zuweisung ist der Retain-Account 1; nach dem Anzeigen von alertView der Retaincount ist 6 nach dem Loslassen retaincount bleibt 5 -> und ein Speicherverlust tritt auf –

Antwort

6

Dies ist sinnvoll, wenn Sie feststellen, dass [alert show] die Warnung nicht sofort auf dem Bildschirm anzeigt. Ich denke, was passiert, ist, dass die [Alarm-Show] die Warnung zu irgendeiner Warteschlange irgendwo im System hinzufügt, die sie behält. Es wird erst angezeigt, wenn Sie von dieser Funktion zurückkehren und zur Ereignisschleife zurückkehren. Wenn es schließlich entlassen wird, werden diese Retain-Zählungen dekrementiert und es wird dann freigegeben.

Wenn Sie Nachrichten von Delegiertenroutinen von UIAlertView wie didPresentAlertView protokollieren, wette ich, dass dies erst nach dem Ende Ihrer Funktion geschieht, nachdem Sie die Warnung "freigegeben" haben. Freigabe bedeutet nicht immer Verzicht, es gibt nur das Eigentum auf. Es verursacht nur eine Dealloc, wenn keine Besitzer übrig sind.

0

Meine Vermutung wäre, dass dies mit der Beta-SDK verwandt ist. Es gibt viele Fehler/Bugs in den Betas. Ich würde vorschlagen, es mit dem 3.1.3 oder 3.2 SDK zu überprüfen.

+0

Ich bin geneigt zuzustimmen, aber ich fragte mich nur, ob ich verrückt war oder ob dies aus irgendeinem seltsamen Grund beabsichtigt war. Vielen Dank! – Erik

3

Ich bezweifle stark, dass dies ein Speicherleck ist. Die Alarmansicht wird gerade angezeigt: sie wird zum Fenster hinzugefügt, usw.: alle behalten, was sie besitzen. Ich wette, wenn Sie einmal nachsehen, dass es geschlossen wurde, wird es nicht mehr existieren.