2013-03-12 1 views
10

Vedo sempre boilerplate per UITableViewController dichiarareQual è il vantaggio dell'utilizzo di una NSString statica per CellIdentifier?

static NSString *CellIdentifier 

in

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 

Perché statica? L'ho modificato in molti punti perché le mie modifiche CellIdentifier si basano sulla sezione? qual è il motivo dietro questo essere statico? Sto influenzando le prestazioni?

risposta

21

cellForRowAtIndexPath: viene chiamato un lotto. Ogni volta che si ha un metodo che viene ripetuto più volte in un breve lasso di tempo, si desidera ridurre al minimo il numero di oggetti che sono in attesa di essere rilasciati automaticamente, poiché questi oggetti verranno conservati nello stack fino a quando - almeno - ciclo di esecuzione successivo. L'utilizzo di una stringa statica garantisce che l'oggetto stringa venga creato una sola volta, anziché ogni volta che viene chiamato il metodo.

Non è strettamente necessario, ma quando si dispone di una quantità limitata di memoria come si fa sui dispositivi mobili, si desidera ottimizzare il numero di oggetti che vengono creati in un breve lasso di tempo, ove possibile.

+0

Quindi è meglio usare una NSString statica per ogni identificatore? –

+0

Sì. Onestamente, se hai un piccolo numero di file nella tua tabella non farà davvero molta differenza - iOS è diventato molto più utile nella raccolta dei rifiuti, soprattutto da quando è uscito ARC. Ma anche così, è un'ottimizzazione che non richiede sforzi, quindi potresti anche usarlo. – memmons

+0

grazie a questa è stata più una curiosità che un problema irrisolto, ma buono da sapere andare avanti. Grazie. –

0

Mentre sono d'accordo con @Answerbot per quanto riguarda l'aspetto delle prestazioni delle stringhe statiche, vale la pena notare che le stringhe statiche sono meno soggette a errori. L'IDE completerà automaticamente l'oggetto statico NSString, garantendo così che la stringa sia denominata in modo coerente.

EDIT:

Se si utilizza il seguente codice:

static NSString *cellIndentifier = @"myCellIdentifier"; 

è possibile utilizzare liberamente la variabile 'cellIdentifier' senza preoccuparsi l'ortografia della stringa effettiva utilizzata.

+3

Cosa intendi con questo? Xcode completerà automaticamente qualsiasi nome di variabile. –

+1

xcode completa automaticamente tutto, indipendentemente dal fatto che sia statico, locale o addirittura una macro. –

+0

Sì, quello che intendevo era dichiarare NSString statico * cellIdentifier = @ "cellIdentifier"; puoi utilizzare le funzioni di autocomplete di XCode per la variabile cellIdentifier invece di avvitare e scrivere @ "CellIdentifier" o @ "cellidentifier" quando intendevi dire @ "cellIdentifier" – JiuJitsuCoder

3

Quando una variabile viene dichiarata static, nel programma esiste solo un'istanza di tale variabile. Poiché si tratta di un valore costante assegnato solo una volta, questo approccio evita di riservare e assegnare una variabile stack per questo. Ovviamente quella variabile di stack è quasi certamente ottimizzata dal compilatore, e il contant di stringa è già ottimizzato nello storage statico dal compilatore. Quindi è un'ottimizzazione piuttosto piccola che è un suggerimento su ciò che lo sviluppatore intende (cioè tutte le istanze condividono lo stesso valore) di qualsiasi altra cosa.