iPhone Dev - Que caminho deve um membro ser adicionado como um subview
-
10-07-2019 - |
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?
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