Pregunta

En algún lugar que estaba leyendo eso, con respecto a las advertencias de poca memoria y renunciar a una vista no visible con todas sus subvistas (= una plumilla completa, creo), deberías hacer eso:

-(void)dealloc {
    [anView release], anView = nil;
    [someImageView release], someImageView = nil;

    [super dealloc];
}

en lugar de

-(void)dealloc {
    [anView release];
    [someImageView release];

    [super dealloc];
}

¿Cuál es la razón para conectar esos punteros a cero (= " ningún objeto "), después de llamar a la versión? Déjeme adivinar: ¿Algún otro método podría haber retenido la vista por algún motivo (a alguien le dio algún ejemplo de cuándo podría suceder esto?), Entonces sucede lo que sucedió didReceiveMemoryWarning, y libera una vista completa de nib + que actualmente no está visible (es decir, en una aplicación multiview). Tan pronto como el usuario quiera ver esa vista nuevamente, usted cargará rápidamente la punta nuevamente y luego: ¡Carga todas las vistas, conecta los puntos de venta y BANG! Sus otras vistas retenidas están colgadas ahora sin ningún puntero en algún lugar solitario en el bloque de memoria, lo que provoca una pérdida de memoria profunda y gorda hasta que su aplicación falla.

¿Correcto / incorrecto?

¿Fue útil?

Solución

en lugar de hacer el lanzamiento expicit y establecerlo en nulo, si sus accesores tienen propiedades asociadas con ellos yoc y hacen lo siguiente como un método más conciso:

- (void) dealloc
{
    self.retainedProperty1 = nil;
    self.retainedProperty2 = nil;
    self.copiedProperty = nil;
    self.assignedProperty = nil;
}

de esta manera, puede tener un código que tenga menos repetición, ya que el código sintetizado se hará cargo de sus lanzamientos por usted.

Editar: debo señalar que sus propiedades no pueden ser de solo lectura o de lo contrario obtendrá errores de compilación por razones obvias :)

Otros consejos

El principio es más general que UIView. de hecho, es más general que el método Objective-C / Cocoa -release . Es válido también con C malloc () / free () funciones de memoria.

Cuando ya no necesite un objeto o cualquier zona de memoria, primero lo libera / libera. Luego, para asegurarse de que no volverá a utilizarlo, borre los medios para acceder a este objeto o zona de memoria asignando un nil a un objeto o un NULL a un puntero de memoria.

  

Algún otro método podría haber retenido la vista por alguna razón

A menos que estés invocando dealloc , solo se invoca cuando el recuento retenido es cero.

Tenga en cuenta que en Objective-C envía un mensaje a un nil " objeto " es (a menudo) perfectamente bien. Si lo hace, no hará que su programa se detenga, pero el mensaje simplemente se ignora. Sin embargo, no puede enviar un mensaje a un objeto liberado, lo que provocaría un bloqueo.

Por lo tanto, lo siguiente le daría un error:

[anView release];
[anView doSomething];

Pero, de hecho, esto está bien:

[anView release];
anView = nil;
[anView doSomething];

Es una cuestión de gusto, pero por lo anterior, de hecho, es posible que prefieras bloquear tu programa, en lugar de preguntarte por qué no se ejecuta Algo ...

Ver también Enviando mensajes a nula desde Introducción a The Objective-C Lenguaje de programación 2.0 .

Se llama al método -dealloc cuando se libera el objeto y no se ejecutará ningún otro método en el objeto después. Por lo tanto, establecer cualquier variable de instancia en nil no tiene ningún efecto fuera de ese objeto.

Si liberara un objeto (sin usar un setter) en otra parte de la clase, sería importante establecer la variable de instancia en nil para evitar que el código en otro lugar envíe un mensaje a esa dirección.

Uso mucho este patrón:

- (void) showHelp: (id) sender
{
    if (helpController == nil)
    {
        helpController = [[HelpController alloc] initWithNibName: @"Help" bundle: [NSBundle mainBundle]];
    }
    [self presentModalViewController: helpController animated: YES];    
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
    [helpController release];
    helpController = nil;
}

Casi en todas partes que asigno un controlador de vista que es modal, o de otro modo " temporal " ;. De esta manera, se cuelga si lo necesito de nuevo, pero desaparece si la memoria se agota.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top