Domanda

quali sono le migliori pratiche per riutilizzare UIViewController? In molte app (inclusi gli esempi di Apple: ad esempio SQLiteBooks), i controller UIViewController vengono allocati e inizializzati ogni volta, un UIViewController viene inserito nello stack. Ciò aumenta l'uso della memoria con ogni nuovo controller, poiché gli oggetti rimangono in memoria e non vengono riutilizzati.

Come migliorarlo?

È stato utile?

Soluzione

Questo è ciò che faccio quando creo un nuovo viewcontroller e la memoria viene rilasciata quando la vista viene rimossa dalla finestra

MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease];
[[self navigationController] pushViewController:mvc animated:YES];

Altri suggerimenti

  

Questo aumenta l'uso della memoria con   ogni nuovo controller, perché il   gli oggetti rimangono nella memoria e non lo sono   usato di nuovo.

Dovrebbe essere rilasciato quando lo stack è saltato fuori, purché non ci sia qualcos'altro che lo trattiene. Verifica che i tuoi metodi dealloc vengano chiamati.

Inoltre, se viene inserito nello stack, è necessario tenerlo almeno fino a quando non viene visualizzato (cosa che si verifica automaticamente se si seguono i modelli standard). Quindi viene riutilizzato.

Quindi, seguendo il modello standard, il tuo utilizzo della memoria dovrebbe già essere ridotto al minimo.

Hai effettivamente un problema di memoria che stai cercando di risolvere o è un caso di ottimizzazione prematura ? Direi che a meno che non ci sia un problema specifico di risorse, la migliore pratica sarebbe quella di seguire i modelli di controller di visualizzazione standard.

Inserisci un punto di interruzione nella funzione dealloc del controller di visualizzazione e assicurati che venga chiamato quando rimuovi il controller di visualizzazione dalla finestra. La memoria non dovrebbe continuare ad accumularsi. Se stai creando e rilasciando automaticamente i tuoi controller (come mostra LostInTransit sopra), la memoria per ciascun controller dovrebbe essere rilasciata quando viene rimossa.

Se vedi che dealloc non viene chiamato, significa che da qualche parte nell'app esiste ancora un riferimento al controller di visualizzazione.

Non dimenticare che un View Controller non è la tua vista.

Le viste gestite da un controller di visualizzazione possono essere scaricate, quindi i controller di visualizzazione stessi sono molto leggeri. Se vuoi mantenere il footprint davvero leggero, potresti annullare tutti gli altri dati che il controller ha allocato in viewDidUnload (chiamato principalmente quando c'è un avviso di memoria - è solo una cosa 3.0).

Come notato, per lo più i controller di visualizzazione saranno deallocati quando li lasci (colpisci indietro), quindi non ci sono comunque in giro comunque. Ma a volte trovo utile lasciare un riferimento se voglio riaprire quella vista nello stesso stato in cui l'utente l'ha lasciata (non funziona tra i lanci di app).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top