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?

¿Fue útil?

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

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