iPhone Dev - In che modo aggiungere un membro come sottoview
-
10-07-2019 - |
Domanda
(Stiamo parlando di codice all'interno di sottoclassi personalizzate UIViewController - E comunque non uso IB) Ok, quindi ho impostato il membro self.view in - void) loadView, e poi creo i miei controlli e visualizzazioni e quant'altro in - (void) viewDidLoad, quindi aggiungerli alla sottoview. Se il controllo non è un membro, se lo creo e lo rilascio localmente nel metodo, ecco come lo faccio: (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];
}
Questo è solo un esempio di come vorrei creare un'etichetta localmente, impostarne le proprietà, aggiungere alla sottoview e rilasciare. Ma con un membro, faccio questo:
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];
}
Ma l'ho anche visto fatto
...
- (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];
}
così nel mio sviluppo iniziale di iPhone 3: esplorare il libro sdk. Notare l'aggiunta della variabile locale, quindi il rilascio. Cosa dovrei fare? Importa per niente?
Soluzione
Se lblMessage
è una proprietà di mantenimento (che è spesso vera), allora non ci sono differenze funzionali. Altrimenti, release-before-addSubview è un bug, poiché tenterà di aggiungere un oggetto deallocato come sottoview.
Ecco una breve panoramica del conteggio dei riferimenti su localMessage
, supponendo che la proprietà lblMessage
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.
Desideri che .Vedere
.
Altri suggerimenti
L'etichetta che è un membro e l'etichetta dell'ambito locale sono riferimenti reciproci, quindi sono lo stesso oggetto, quindi non importa in che modo lo fai, semplicemente non avrei il locale e inizializzerei direttamente l'etichetta