iPhone Dev: de qué manera se debe agregar un miembro como subvista
-
10-07-2019 - |
Pregunta
(Estamos hablando de código dentro de las subclases UIViewController personalizadas, y por cierto no uso IB) Ok, entonces configuro el miembro self.view en - (vacío) loadView, y luego creo mis controles y vistas y lo que sea en - (vacío) viewDidLoad, y luego agréguelos a la subvista. Si el control no es miembro, si lo creo y lo libero localmente en el método, así es como lo hago: (Con un UILabel)
- (void)viewDidLoad {
UILabel *localLabel = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
localLabel.text = @"I'm a Label!";
localLabel.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleBottomMargin);
[self.view addSubview:localLabel];
[localLabel release];
[super viewDidLoad];
}
Eso es solo un ejemplo de cómo crearía una etiqueta localmente, establecería sus propiedades, agregaría a subvista y liberar. Pero con un miembro, hago esto:
UILabel *lblMessage;
...
@property (nonatomic, retain)UILabel *lblMessage;
...
- (void)viewDidLoad {
UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
localMessage.text = @"I'm a Label!";
localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleBottomMargin);
self.lblMessage = localMessage;
[localMessage release];
[self.view addSubview:lblMessage];
[super viewDidLoad];
}
Pero también lo he visto hecho
...
- (void)viewDidLoad {
UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
localMessage.text = @"I'm a Label!";
localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleBottomMargin);
self.lblMessage = localMessage;
[self.view addSubview:localMessage];
[localMessage release];
[super viewDidLoad];
}
así en mi desarrollo inicial de iPhone 3: explorando el libro sdk. Observe que agrega la variable local y luego la libera. ¿Qué debo hacer? ¿Importa en absoluto?
Solución
Si lblMessage
es una propiedad de retención (que a menudo es verdadera), entonces no hay diferencia funcional. De lo contrario, release-before-addSubview es un error, ya que intentará agregar un objeto desasignado como una subvista.
Aquí hay un tutorial rápido del recuento de referencias en localMessage
, suponiendo que la propiedad lblMessage
se mantenga:
UILabel *localMessage = [[UILabel alloc]... // retainCount is now 1
// Set up localMessage. If you release'd now, you'd dealloc the object.
self.lblMessage = localMessage; // retainCount is now 2
// You can safely call release now if you'd like.
[self.view addSubview:localMessage]; // retainCount is now 3.
[localMessage release]; // retainCount is now 2.
Desea que el mantengaCount
termine en 2, ya que efectivamente tiene 2 referencias a ese objeto: su puntero miembro lblMessage
y otro puntero de retención en self .view
.
Otros consejos
La etiqueta que es miembro y la etiqueta de alcance local son referencias entre sí, por lo que son el mismo objeto, por lo que no importa de qué manera lo haga, simplemente no tendría el local e inicializaría la etiqueta directamente