Pergunta

(Estamos falando de código dentro de subclasses UIViewController costume - E pelo jeito eu não uso IB) Ok, então eu definir o membro self.view in - (void) loadView, e então eu criar meus controles e pontos de vista e tudo o que em - (void) viewDidLoad, em seguida, adicioná-los à subexibição. Se o controle não é um membro, se eu criá-lo e liberá-lo localmente no método, isto é como eu faço isso: (Com um 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];
}

Isso é apenas um exemplo de como eu iria criar um rótulo localmente, definir suas propriedades, adicione a subexibição e solte. Mas com um membro, eu faço isso:

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];
}

Mas eu também vi isso feito

...
- (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];
}

como que em minha começando iPhone 3 desenvolvimento: explorando o livro SDK. Observe adicionando a variável local, em seguida, libertando. Que devo fazer? Isso importa em tudo?

Foi útil?

Solução

Se lblMessage é uma propriedade de retenção (que muitas vezes é verdade), então não há diferença funcional. Caso contrário, a liberação antes-addSubview é um erro, uma vez que irá tentar adicionar um objeto deallocated como um subview.

Aqui está uma rápida passagem pelo contagem de referência no localMessage, assumindo o lblMessage propriedade está retendo:

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.

Você quer o retainCount para terminar em 2, desde que você efetivamente tem 2 referências a esse objeto -. Seu lblMessage ponteiro membro, e outro ponteiro de retenção na self.view

Outras dicas

A etiqueta que é um membro e o rótulo âmbito local são referências para o outro para que eles são o mesmo objeto, de modo que não importa o caminho que u fazê-lo, eu só não teria o local e inicializar a etiqueta diretamente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top