2012-07-04 13 views
15

Esta pregunta es realmente básica. ¿Cuál es la diferencia de rendimiento entre eliminar un UIView de la jerarquía de vista y ocultar un UIView?Rendimiento de UIView: removeFromSuperview VS hide

He leído que las Vistas que no son necesarias deben eliminarse de la jerarquía de vistas. Actualmente tengo la situación de que un UIButton a veces debe ser visible. ¿Cuándo oculto el UIButton y cuándo lo elimino de su super visión?

¿Es costoso cambiar la jerarquía de vista?

Respuesta

1

Si necesita alternar entre mostrar y ocultar la subvista, el mejor enfoque definitivamente es ocultarlo. Para un UIButton las implicaciones de la memoria no son tan buenas de todos modos. Y el código es ciertamente más simple si solo cambia la propiedad hidden.

Además, se obtiene la ventaja adicional de que la propiedad hidden es animable.

+0

Entonces, ¿cuál es la diferencia entre renderizar un UIView oculto y no tener esa vista en la jerarquía de vista? ¿Hay una diferencia? – bas

+0

Sí. En caso de que se haya eliminado, básicamente lo está recreando desde cero. Esto podría ser bueno para la administración de memoria, pero podría ser malo para el rendimiento, y menos lindo ya que no se puede animar el cambio. – Mundi

+0

Bueno, si mantienes una referencia a la vista, no es necesario volver a crearla. Me interesaba la sobrecarga de alterar la jerarquía de vistas. ¿Qué provoca esta alteración? Imagino que básicamente altera una estructura de árbol que UIKit está administrando como una representación de la jerarquía de vista. ¿Crees que eso es correcto? – bas

7

He hecho un experimento en iOS6 iPad mini, con una gran vista de desplazamiento que tiene un montón de contenido rico (incluyendo imágenes, sombras, gradientes, imágenes de fondo con dibujos, ya sabes, esos diseñadores :)) y Encontré view.hidden = YES ≠ [ver removeFromSuperview].

Originalmente pensé que la configuración oculta a SÍ hará que la vista no sea renderizada/dibujada, por lo tanto, tener muchas vistas ocultas no tendrá impacto en la eficiencia. Pero el resultado real es: 1) si configuro las vistas fuera de pantalla en la vista de desplazamiento grande a ocultas (y las visualizo cuando vuelven al área visible), el desplazamiento no es uniforme/continuo. Cuando se desacelera naturalmente, se ve muy nervioso. 2) si elimino las vistas fuera de pantalla de la vista de desplazamiento (pero aún las guardo en la memoria con una matriz de seguimiento, para que cuando vuelvan puedan agregarse inmediatamente), el desplazamiento es obviamente más suave.

+2

Eso en realidad reitera el hecho de que al configurar una UIView en 'oculto' se evita que se represente y posiblemente aumente el rendimiento de alguna manera. Claro, la inquietud consiste en dejarla 'oculta', lo que posiblemente fuerce un setNeedsDisplay junto con un setNeedsLayout (no estoy seguro de esto último), lo que contribuiría a la desaceleración. Para una vista de tabla es posiblemente una mala idea, pero para una vista mucho más grande "detrás" de otras vistas, puede ser una buena idea esconderla para que no desencadene un rediseño innecesario cuando no sea necesario. – strange