¿Necesito liberar recursos xib?


Si tengo algo como un UILabel vinculado a un archivo xib, ¿necesito liberarlo en dealloc de mi vista? La razón por la que pregunto es porque no lo reparto, ¿lo que me hace pensar que tampoco necesito liberarlo? eg (en el encabezado):

IBOutlet UILabel *lblExample;

En la implementación:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}
Author: Bill the Lizard, 2008-09-15

8 answers

Si sigue lo que ahora se considera una buena práctica, debería liberar las propiedades de salida, porque debería haberlas conservado en el accessor establecido:

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

La ventaja de este enfoque es que hace que la semántica de gestión de memoria sea explícita y clara, y funciona de manera consistente en todas las plataformas para todos los archivos nib.

Nota: Los siguientes comentarios solo se aplican a iOS anteriores a 3.0. Con la versión 3.0 y posterior, en su lugar, debe simplemente nil valores de propiedades en viewDidUnload.

Una consideración aquí, sin embargo, es cuando su controlador podría disponer de su interfaz de usuario y recargarla dinámicamente a petición (por ejemplo, si tiene un controlador de vista que carga una vista desde un archivo nib, pero a petición say digamos bajo presión de memoria it lo libera, con la expectativa de que se puede recargar si la vista es necesaria de nuevo). En esta situación, debe asegurarse de que cuando la vista principal esté eliminada, también renuncie propiedad de cualquier otro punto de venta para que también puedan ser desasignados. Para UIViewController, puede resolver este problema sobrescribiendo setView: de la siguiente manera:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

Desafortunadamente esto da lugar a otro problema. Debido a que UIViewController implementa actualmente su método dealloc usando el método setView: accessor (en lugar de simplemente liberar la variable directamente), self.anOutlet = nil será llamado en dealloc, así como en respuesta a una advertencia de memoria... Esto llevará a un accidente en dealloc.

El el remedio es asegurarse de que las variables de salida también se establecen en nil en dealloc:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}
 35
Author: mmalc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-24 08:37:39

Encontré lo que estaba buscando en los documentos de Apple. En resumen, puede configurar sus objetos como propiedades que libera y conserva (o simplemente @property, @synthesize), pero no tiene que hacerlo para cosas como UILabels:

Http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

 4
Author: rustyshelf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 14:38:42

El

[anOutlet release], anOutlet = nil;

La parte es completamente superflua si has escrito setView: correctamente.

 3
Author: Wil Shipley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-20 01:26:52

Si no lo sueltas en dealloc, aumentará la huella de memoria.

Vea más detalles aquí con el gráfico ObjectAlloc del instrumento

 1
Author: Shaikh Sonny Aman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 11:05:49
 0
Author: Sören Kuklau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:32:49

Se asigna la etiqueta, en cierto sentido, creándola en IB.

Lo que hace el IB es mirar sus IBOutlets y cómo se definen. Si tiene una variable de clase a la que IB debe asignar una referencia a algún objeto, IB enviará un mensaje de retención a ese objeto por usted.

Si está utilizando propiedades, IB hará uso de la propiedad que tiene que establecer el valor y no retener explícitamente el valor. Por lo tanto, normalmente marcaría las propiedades de IBOutlet como retain:

@property (nonatomic, retain) UILabel *lblExample;

Así en ether case (usando propiedades o no) debe llamar a release en su dealloc.

 0
Author: Kendall Helmstetter Gelner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 04:49:13

Cualquier IBOutlet que sea una subview de la vista principal de su Nib no necesita ser liberado, porque se le enviará el mensaje de autorelease al crear el objeto. Los únicos IBOutlet que necesita liberar en su dealloc son objetos de nivel superior como controladores u otros NSObject. Todo esto se menciona en el documento de Apple vinculado anteriormente.

 0
Author: Eric Allam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 13:44:15

Si no establece el IBOutlet como una propiedad, sino simplemente como una variable de instancia, debe liberarlo. Esto se debe a que en initWithNib, se asignará memoria para todos los IBOutlets. Así que este es uno de los casos especiales que debe liberar a pesar de que no ha retenido o asignado ninguna memoria en el código.

 0
Author: stephen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-13 04:28:13