objective framework entre diferencias iphone objective-c cocoa-touch

iphone - framework - objective c vs swift



¿Debo liberar recursos xib? (8)

Cualquier IBOutlet que sea una subvista de la vista principal de su Nib no necesita ser liberado, ya que se les enviará el mensaje de liberación automática al momento de la creación del 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.

Si tengo algo así 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 la asigno, ¿qué me hace pensar que tampoco necesito liberarla? por ejemplo, (en el encabezado):

IBOutlet UILabel *lblExample;

en la implementación:

.... [lblExample setText:@"whatever"]; .... -(void)dealloc{ [lblExample release];//????????? }



Usted asigna la etiqueta, en cierto sentido, al crearla en IB.

Lo que hace IB, es ver sus IBOutlet y cómo se definen. Si tiene una variable de clase que IB es para 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 para establecer el valor y no retener explícitamente el valor. Por lo tanto, normalmente marcaría las propiedades IBOutlet como retener:

@property (nonatomic, retain) UILabel *lblExample;

Por lo tanto, en caso de éter (usando propiedades o no) debe llamar a liberar en su dealloc.


los

[anOutlet release], anOutlet = nil;

Parte es completamente superfluo si has escrito setView: correctamente.



Si sigue lo que ahora se considera una buena práctica, debe liberar las propiedades de salida, ya que debería haberlas conservado en el acceso del conjunto:

@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 administració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 se aplican solo a iOS antes de 3.0. Con 3.0 y posterior, en su lugar, simplemente debe anular los valores de propiedad en viewDidUnload.

Una consideración aquí, sin embargo, es cuando su controlador puede deshacerse de su interfaz de usuario y volver a cargarla dinámicamente bajo demanda (por ejemplo, si tiene un controlador de vista que carga una vista desde un archivo Nib, pero a petición, por ejemplo bajo presión de memoria) - lo libera, con la expectativa de que pueda volver a cargarse si la vista es necesaria de nuevo). En esta situación, quiere asegurarse de que cuando se deseche la vista principal, también renuncie a la propiedad de otros puntos de venta para que también puedan desasignarse. Para UIViewController, puede solucionar este problema anulando setView: siguiente manera:

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

Lamentablemente, esto da lugar a un problema adicional. Debido a que UIViewController implementa actualmente su método dealloc utilizando el método setView: accessor (en lugar de simplemente liberar la variable directamente), self.anOutlet = nil se llamará en dealloc y en respuesta a una advertencia de memoria ... Esto dará lugar a una chocar en dealloc .

El remedio es garantizar que las variables de salida también estén configuradas como nil en dealloc :

- (void)dealloc { // release outlets and set variables to nil [anOutlet release], anOutlet = nil; [super dealloc]; }


Si no establece IBOutlet como una propiedad, sino simplemente como una variable de instancia, aún debe liberarla. Esto se debe a que en initWithNib, la memoria se asignará para todos los IBOutlets. Este es uno de los casos especiales que debe liberar aunque no haya retenido ni haya asignado memoria en el código.