2010-05-19 18 views
5

Soy relativamente nuevo en el desarrollo de iPhone, así que esto puede ser mi culpa, pero va en contra de lo que he visto. :)UIAlertView -show que causa una pérdida de memoria

Creo que estoy creando un UIAlertView que vive solo en este vacío de la declaración 'if'.

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; 
} 

Sin embargo, los registros de la consola me desconciertan.

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

He intentado también añadiendo:

alert = nil; 

después del lanzamiento. Eso hace que el retener cuente 0, pero sigo mostrando una fuga. Y si ayuda, el Marco Responsable de la fuga es UIKeyboardInputManagerClassForInputMode. También estoy usando OS 4 Beta 3.

Entonces, ¿alguien tiene alguna idea de cómo un conteo de retención de UIAlertView local se incrementaría en 5 al llamar -show?

Gracias por su ayuda!

+0

Estoy viendo lo mismo - con la versión de lanzamiento de iOS 4.1. El lanzamiento no parece importar, y probé Autorelease en su lugar - lo mismo. Esto debe ser un error en el sistema operativo, ¿verdad? – Axeva

+0

Veo lo mismo hoy en iOS 4.1, y gracias por esta pregunta. – AechoLiu

+0

, pero ¿cómo es posible resolver este problema? estoy en la misma situación. después de la asignación, la cuenta reincidente es 1; después de mostrar la alertaVer el recuento de retenciones es 6 después de liberarlo, se mantiene el conteo de 5 -> y se produce una pérdida de memoria –

Respuesta

6

Esto tiene sentido si se da cuenta de que [alerta] no coloca la alerta en la pantalla de inmediato. Creo que lo que sucede es que el [show de alertas] agrega la alerta a alguna cola en algún lugar del sistema que la retiene. No se mostrará hasta que regrese de esta función y regrese al bucle de evento. Cuando finalmente se descarta, los recuentos retenidos se reducirán y se lanzarán en ese momento.

Si tuviera que registrar mensajes de las rutinas de delegado de UIAlertView, como didPresentAlertView, apostaría que eso no sucederá hasta después de que termine su función, después de haber "liberado" la alerta. La publicación no siempre significa desasignar, simplemente es renunciar a la propiedad. Solo causa un descuido si no quedan dueños.

0

Supongo que esto está relacionado con el beta sdk. Hay muchos errores/errores en las versiones beta. Sugeriría comprobarlo con el 3.1.3 o 3.2 sdk.

+0

Me inclino a estar de acuerdo, pero me preguntaba si estaba loco o si este era el comportamiento previsto por alguna extraña razón. ¡Gracias! – Erik

3

Dudo mucho que esto sea una pérdida de memoria. La vista de alerta se está mostrando: se está agregando a la ventana, etc., y todos conservan lo que poseen. Te apuesto a que si revisas una vez que ha sido cerrado, ya no existirá.