2012-04-26 16 views
6

Anche se sono sicuro che esistano, ho difficoltà a trovare o definire una best practice ufficiale per dichiarare gli outlets in un ViewController.Gli IBOutlet dovrebbero essere ivar o proprietà?

Ci sono 3 opzioni per quanto posso vedere:

  1. ivar solo
  2. proprietà solo
  3. proprietà sostenuto con un Ivar

Xcode si blocca al momento quando provo e auto -generare una proprietà trascinando nel mio ViewController da IB, ma da quello che ricordo, facendo ciò crea una proprietà senza un ivar. È anche possibile trascinare nella sezione di ivar e questo creerà un ivar senza una proprietà. Questo suggerisce che solo le prese di sola e ivar sono OK con Apple.

Quindi in viewDidUnload è necessario assegnare nil a uno qualsiasi dei nostri punti vendita, ma per quanto riguarda dealloc. Se abbiamo usato una proprietà senza un ivar, come possiamo rilasciare il nostro outlet affermando che non dovremmo usare alcun accessorio in un init o dealloc?

Mi sembra che l'unico schema che ci consentirebbe di rilasciare la nostra presa senza un accessorio è l'utilizzo di una proprietà supportata da un ivar, quindi possiamo rilasciare manualmente il nostro ivar in dealloc senza utilizzare il suo accessor, tuttavia questo è il un'opzione che la generazione del codice di Apple non supporta.

risposta

1

Come regola generale, di solito creo i metodi di accesso per IBOutlet s.

In ARC o progetti non-ARC di solito faccio la seguente:

//.h (ARC) 
@property (nonatomic, weak) IBOutlet UILabel* myLabel; 

//.h (non-ARC) 
@property (nonatomic, retain) IBOutlet UILabel* myLabel; 

//.m 
@synthesize myLabel; 

In questo modo si può lasciare al compilatore di creare una variabile di istanza per voi. Ma puoi anche dichiarare la tua variabile di istanza e dire al compilatore di usarla.

Quindi è possibile utilizzare tale Accessor/variabile di istanza ovunque si desideri.

Il numero Apple Memory Management guide indica che è necessario evitare i metodi di accesso nei metodi init o dealloc quando si hanno progetti non ARC. Quindi, ad esempio:

// (non-ARC) 
- (void)dealloc 
{ 
    [myLabel release]; myLabel = nil; // I'm using the instance variable here! 
    [super dealloc];  
} 

Questo è molto importante in progetti non ARC. Il motivo è che, se non ci sono accessor, KVC assegna l'oggetto pennino alla variabile di istanza e ne inserisce un trattino. Se ti dimentichi di rilasciarlo, potresti avere una perdita di memoria. Usando un accessor ti costringono a rilasciare quell'oggetto alla fine.

Consiglio vivamente di leggere friday-qa-2012-04-13-nib-memory-management di Mike Ash. È un articolo molto interessante su pennino e gestione della memoria.

Spero che aiuti.

+0

Grazie. Questo è chiaro e un bel collegamento. – Undistraction

+0

@ 1ndivisibile Prego. Voto superiore o segno come risposta se lo si desidera. Saluti. –

+0

La chiamata a super dealloc dovrebbe venire dopo la versione della variabile di istanza. –

1

Ecco la mia comprensione

utilizzare le proprietà per le variabili che saranno accessibili da altre classi, o leggere (getter) o scritta (setter). Sia setter che getter sono sintetizzati per le proprietà.

Utilizzare ivars per le variabili che verranno utilizzate internamente solo dalla classe proprietaria, vale a dire che le altre classi non imposteranno o otterranno i loro valori.

Certo, è possibile utilizzare le proprietà al posto di ivars, ma esse sono soggette al sovraccarico della chiamata di funzione ogni volta che si accede a esse. Pertanto, se si dispone di una variabile interna a cui si accede dalla classe un LOT, le chiamate alla funzione influiscono sulle prestazioni in tempo reale e ciò può essere evitato dichiarandole come ivars.

Problemi correlati