2011-12-29 13 views
7

Ho un UITableView. ogni riga è un oggetto pesante con video, immagini ecc. Quando l'utente scorre questa vista, come posso rilasciare la memoria delle righe non visibili e caricare le righe visibili correnti?Le celle di UITableView si rilasciano quando non sono visibili

+1

utilizza celle riutilizzabili e dimentica la gestione della memoria (lasciare al sistema) – samfisher

risposta

6

Suppongo che stiate parlando di liberare memoria utilizzata dalle immagini e dai video della riga e non dalla riga stessa.

Nel vostro delegato Tableview,

-(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView 

ti dice quando lo scorrimento Tableview si è fermato.

[myTableView indexPathsForVisibleRows] 

fornisce una matrice di ciò che è visibile.

Se la riga non è in questo array, non è visibile e su di esso è possibile eseguire la pulizia dell'immagine/del video.

2

Stai riciclando UITableViewCells secondo le raccomandazioni di Apple? In caso contrario, è necessario leggere i documenti di Apple. All'interno di cellForRowAtIndexPath: delegato si dovrebbe avere qualcosa [customCell setMediaObjects:]. All'interno della classe customCell è possibile rilasciare tutti i mediaObjects precedenti dalla memoria.

1

A Closer Look at Table-View Cells - Apple Documentation

Quando si chiama dequeueReusableCellWithIdentifier prima 10 (a soli dieci cellule possono essere visualizzati a schermo in un dato momento) saranno creati cellule, allora saranno appena caricati e configurati per mostrare. Quindi, le celle non vengono rilasciate.

2

Come altri hanno già detto, è necessario assicurarsi di riciclare le celle correttamente e di non distruggere le cose che sarebbe necessario ricreare comunque quando la cella viene riutilizzata.

Tuttavia, è possibile rilasciare altre risorse che la cella o le sue viste conservano. O se quella cella ha richieste di download in sospeso, ad esempio, potresti voler reimpostare la priorità o addirittura cancellarle quando la cella è fuori schermo.

penso che il modo più pulito per farlo è quello di ignorare solo -[UITableViewCell prepareForReuse]

Questo è chiamato quando la cella viene rimesso in coda riutilizzo. Se l'utente si muove rapidamente su e giù per il tavolo, potresti non voler pulire la cella nel momento in cui la cella è fuori dallo schermo (ad esempio, indicando indexPathsForVisibleRows).

Ma quando la cella viene effettivamente reinserita nella coda di riutilizzo, è un buon momento per farlo, dato che si sa che la cella non riappare sullo schermo finché non si deseleziona e si configura nuovamente.

Problemi correlati