tarda software restaurar puedo pudo problema para ocurrio ocurrido esta error desconocido descargar descargando desbloquear cuanto contacto apple actualizar iphone

software - no puedo actualizar mi iphone 6



¿Tienes que liberar IBOulets en dealloc? (7)

¿Tienes que liberar IBOulets en dealloc? No estoy seguro en este caso porque no hice la asignación y, por lo general, solo liberas para algo que llamas asignar. ¿Nadie sabe?


Como dijiste, debes liberar todo lo que te alloc (con alloc o copy ). Funciona de la otra manera: no debe liberar ningún objeto Cocoa que no haya asignado usted mismo (algunas funciones de CoreFoundation se asignan y usted es responsable de liberarlos, pero no es el caso aquí).

Si no asignó su IBOutlet, entonces no tiene que liberarlo, a menos que, por alguna razón, lo retenga en algún lugar.


Esto es lo que he estado haciendo con respecto a los objetos de IBOutlet (junto con un archivo NIB):

@interface MyViewController : UIViewController { UILabel *label; } @property (nonatomic, retain) IBOutlet UILabel *label; @end @implementation MyViewController @synthesize label; - (void)setView:(UIView *)aView { if (!aView) { // view is being set to nil // set outlets to nil to get the benefit of the didReceiveMemoryWarning! self.label = nil; } // Invoke super''s implementation last [super setView:aView]; } - (void)viewDidLoad { [super viewDidLoad]; } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; self.label = nil; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn''t have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren''t in use. } - (void)dealloc { [label release]; [super dealloc]; }

Pregunta secundaria: ¿Tiene más sentido usar self.label = nil en dealloc, o debe release que se llame de forma explícita (por ejemplo, para mantener al analizador de estática feliz)?

Supongo que, en ese momento, estamos saliendo de todas formas, así que no hay necesidad de establecer nuestros objetos IBOutlet en cero.


No se trata de IBOutlet, se trata de su declaración. Si usa un nuevo asistente de proyecto en Xcode, probablemente obtenga un código como este en su archivo de encabezado.

@property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

Puedes ver, hay una palabra clave de retención en el archivo de encabezado. Siguiendo la guía de administración de memoria, DEBE liberar todo lo que retiene (llamando a alloc, copy, retener, etc.). Y lo tiene retenido en su código, entonces debe liberarlo .

Además, el asistente ya agrega un código de lanzamiento para ti.

- (void)dealloc { [tabBarController release]; [window release]; [super dealloc]; }


Para responder a la pregunta del lado por Joe D''Andrea. Puedes usar self.label = nil; . Porque está llamando a setLabel, que se genera automáticamente:

- (void)setLabel:(UILabel *)input { [label autorelease]; label = [input retain]; }

Como se puede ver, se liberará la label actual y luego se asigna nil a la etiqueta.

Pero asegúrate de no escribirlo como label = nil . Eso no funcionará. Porque necesita llamar al método de acceso a la etiqueta generado automáticamente.


Si este es tu BlahViewController.h:

// BlahViewController.h #import <UIKit/UIKit.h> @interface BlahViewController { IBOutlet UINavigationBar *navigationBar; } @property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar; @end

Entonces este sería tu dealloc en BlahViewController.m:

- (void)dealloc { [navigationBar release]; [super dealloc]; }

Sin embargo, si este es su BlahViewController.h:

// BlahViewController.h #import <UIKit/UIKit.h> @interface BlahViewController { IBOutlet UINavigationBar *navigationBar; } @end

Entonces este sería tu dealloc en BlahViewController.m:

- (void)dealloc { [super dealloc]; }

Y, finalmente, si este es tu BlahViewController.h:

// BlahViewController.h #import <UIKit/UIKit.h> @interface BlahViewController { IBOutlet UINavigationBar *navigationBar; IBOutlet MKMapView *map; } @property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar; @end

Entonces este sería tu dealloc en BlahViewController.m:

- (void)dealloc { [navigationBar release]; [super dealloc]; }

En resumen, si lo declara como una propiedad, con retain , entonces necesita liberarlo.


Si solo usa IBOutlet en su interfaz, NO necesita liberarlos. El motivo es que, a menos que los guarde explícitamente en su código, simplemente se están configurando. Se quedan porque la vista está ahí. Obviamente, si también usas propiedades y las conservas, necesitas liberarlas en dealloc.


Sus IBOutlets son probablemente @properties . Si lo son, y los tiene retain como un atributo, entonces necesita liberar en -dealloc

En otras palabras:

@interface MyViewController : UIViewController { IBOutlet UITableView *myTable; } @property (nonatomic, retain) IBOutlet UITableView *myTable; @end

Tendrás que [myTable release]; en su dealloc.

Si crea una nueva aplicación basada en navegación en Xcode y busca en appdelegate.h:

@interface Untitled1AppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UINavigationController *navigationController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; @end

y el dealloc para appdelegate.m:

- (void)dealloc { [navigationController release]; [window release]; [super dealloc]; }

La clave para ver aquí son líneas como estas:

@property (nonatomic, retain) IBOutlet UIWindow *window;

Si hay una retención allí, eso significa que la propiedad es "propiedad" de su código y usted debe liberarla.

Por supuesto, hay otras formas, como no declarar los IBOutlets como propiedades, o declararlos como propiedades sin retener. Encuentro que en la mayoría de los casos prefiero que sean propiedades retenidas, que luego tengo que liberar explícitamente. Un ejemplo de esto es cuando se pasa de un controlador de vista a otro. Cuando se descarta un controlador de vista, sus vistas se eliminan y se liberan. Cualquier IBOutlet UILabels en esa vista también sería liberado si no los tengo retenidos. Eso significa que cuando vuelvo a la vista anterior, tengo que revisar y restablecer mis etiquetas y controles a sus últimos valores, cuando podría haberlos guardado fácilmente si solo conservo el IBOutlet.