2011-12-29 13 views
7

Tengo una UITableView. cada fila es un objeto pesado con videos, imágenes, etc. Cuando el usuario se desplaza por esta vista, ¿cómo puedo liberar la memoria de las filas no visibles y cargar las filas visibles actuales?Las celdas de UITableView se lanzan cuando no están visibles

+1

utilice células reutilizables y olvídese del manejo de la memoria (déjelo en el sistema) – samfisher

Respuesta

6

Supongo que está hablando de liberar memoria que utilizan las imágenes y videos de su fila, y no la fila en sí.

En su delegado tableview,

-(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView 

te dice cuando el desplazamiento tableview se ha detenido.

[myTableView indexPathsForVisibleRows] 

le ofrece una matriz de lo que es visible.

Si su fila no está en esta matriz, no está visible, y puede hacer su limpieza de imagen/video en ella.

2

¿Está reciclando UITableViewCells según las recomendaciones de Apple? Si no, DEBE leer los documentos de Apple. Dentro de cellForRowAtIndexPath: delegate debe tener algo [customCell setMediaObjects:]. Dentro de su clase customCell puede liberar todos los objetos mediaObjects anteriores de la memoria.

1

A Closer Look at Table-View Cells - Apple Documentation

Cuando se llama a dequeueReusableCellWithIdentifier primera 10 (sólo diez células se pueden mostrar en la pantalla en un momento dado) se crearán las células, entonces se acaba de cargar y configurados para mostrar. Por lo tanto, las células no se liberan.

2

Como han dicho otros, debe asegurarse de reciclar las celdas correctamente y no destruir las cosas que necesitaría recrear de todos modos cuando la celda se reutiliza.

Pero, es posible que desee liberar otros activos que conservan la celda o sus vistas. O si esa celda tiene alguna solicitud de descarga pendiente, por ejemplo, es posible que desee restablecer su prioridad o incluso cancelarla cuando la celda esté fuera de la pantalla.

creo que la forma más limpia de hacer esto es simplemente anular -[UITableViewCell prepareForReuse]

Esto se llama cuando la célula se vuelve a poner en la cola de la reutilización. Si el usuario se mueve hacia arriba y hacia abajo de la tabla rápidamente, es posible que no desee limpiar la celda en el momento en que la celda está fuera de la pantalla (mirando indexPathsForVisibleRows, por ejemplo).

Pero cuando la celda se vuelve a poner en la cola de reutilización, es un buen momento para hacer ese trabajo, ya que sabe que la celda no volverá a aparecer en la pantalla hasta que la guarde de nuevo y la vuelva a configurar.

Cuestiones relacionadas