Cómo optimizar la memoria para iOS al analizar big data usando Json
ARC (Recuento automático de referencias) se lanzó con iOS5, lo que evita las pérdidas de memoria más comunes, que generalmente son causadas por olvidarnos de liberar memoria. Gestiona automáticamente el proceso de retención y liberación por usted, por lo que no necesita intervenir manualmente. Olvidarse de publicar al final de un fragmento de código es tan fácil como acordarse de comer. ARC completará automáticamente estas tareas por usted en el nivel inferior. Además de ayudarle a evitar pérdidas de memoria, ARC también puede ayudarle a mejorar el rendimiento al garantizar que se libere memoria para objetos que ya no son necesarios.
2. Utilice identificadores de reutilización en los lugares correctos
Un error común en el desarrollo es no utilizar el reuseIdentifier correcto para configurar UITableViewCells, UICollectionViewCells o incluso UITableViewHeaderFooterViews.
Para optimizar el rendimiento, las vistas de tabla deben reutilizar sus datos de UITableViewCell al asignar celdas a filas usando `table view:cellforrowatindexxpath:`. La vista de tabla mantiene una cola de objetos UITableViewCell reutilizables con datos.
Si no utilizas reuseIdentifier, tendrás que configurar una celda completamente nueva cada vez que se muestre una fila de la vista de tabla. Esto tiene un impacto considerable en el rendimiento, especialmente en la experiencia de desplazamiento de la aplicación.
A partir de iOS6, debes usar reuseIdentifiers en las vistas de encabezado y pie de página además de las celdas y vistas complementarias de UICollectionView.
Para usar identificadores reutilizados, agregue este método al objeto de origen de datos cuando agregue una nueva celda en la vista de tabla:
staticNSString * Identificador de celda = @"Cell";
UITableViewCell * cell =[vista de tabla dequeureusablecellwithcidentifier:identificador de celda para ruta de índice:ruta de índice];
Este método excluye aquellas celdas existentes de la cola, o usa las anteriores si es necesario Punta registrada o clase para crear una nueva unidad. Si no hay celdas reutilizables y no ha registrado una clase o punta, este método devuelve cero.
3. Intenta que la vista sea transparente.
Si tiene vistas transparentes, debe establecer su propiedad Opacidad en "Sí".
La razón es que esto permitirá que el sistema presente estas vistas de la mejor manera posible. Esta propiedad simple se puede configurar en IB o en código.
La documentación de Apple describe cómo configurar la propiedad transparente de una imagen de la siguiente manera:
(Opaco) Esta propiedad proporciona una pista al sistema de renderizado sobre cómo manejar la vista. Si se establece en SÍ, el sistema de renderizado considera que la vista es completamente opaca, lo que le permite optimizar algunos procesos de renderizado y mejorar el rendimiento. Si se establece en No, el sistema de renderizado normalmente formará esta vista a partir de otro contenido. El valor predeterminado es "sí".
En imágenes relativamente estáticas, establecer esta propiedad no tendrá mucho impacto. Sin embargo, cuando esta vista está incrustada en una vista de desplazamiento o forma parte de una animación compleja, el rendimiento de su aplicación se verá muy afectado si no se establece esta propiedad.
Puedes usar la opción Depurar\Capa de fusión de colores en el emulador para descubrir qué vistas no están configuradas como opacas. ¡El objetivo es hacer opaco todo lo que se pueda hacer!
4. Evite los XIB demasiado grandes.
Los guiones gráficos agregados en iOS5 están reemplazando rápidamente a los XIB. Sin embargo, los XIB aún pueden resultar útiles en determinadas situaciones. Por ejemplo, si su aplicación necesita adaptarse a dispositivos anteriores a iOS5, o si tiene una vista reutilizable personalizada, inevitablemente los usará.
Si debes ir a XIB, hazlo lo más simple posible.
Intente configurar un XIB separado para cada controlador y, si es posible, distribuya la jerarquía de vistas del controlador de vista en xibs separados.
Es importante tener en cuenta que cuando cargas un XIB, todo se almacenará en la memoria, incluidas las imágenes. Si tiene una vista que no se utiliza inmediatamente, desperdiciará valiosos recursos de memoria. El guión gráfico es otra historia. Storyboard solo crea instancias de controladores de vista cuando es necesario.
El XIB es responsable de almacenar en caché todas las imágenes y, si estás desarrollando para OS X, lo mismo ocurre con los archivos de sonido. La descripción de Apple en el documento relevante es:
Cuando carga una plumilla que hace referencia a un recurso de imagen o sonido, el código de carga de la plumilla escribe los archivos de imagen y sonido en la memoria. En OS X, los recursos de imagen y sonido se almacenan en cachés designados para uso futuro. En iOS, sólo los recursos de imágenes se almacenan en cachés con nombre. Dependiendo de su plataforma, utilice el método "imageNamed:" de nimage o UIImage para obtener el recurso de imagen.
5. No bloquees el hilo principal.
No sobrecargues el hilo principal. Porque UIKit hace todo el trabajo en el hilo principal, renderizando, administrando respuestas táctiles, respondiendo a entradas, etc. Todo debe completarse arriba.
El riesgo de utilizar siempre el hilo principal es que si su código realmente bloquea el hilo principal, su aplicación dejará de responder.
La mayoría de las situaciones que bloquean el proceso principal se producen cuando su aplicación realiza algunas operaciones de E/S que implican la lectura y escritura de recursos externos (como almacenamiento o red).
Puede utilizar NSURLConnection para realizar operaciones de red de forma asincrónica:
+ (void) sendasynchronousrequest: (nsurlrequest *) cola de solicitudes: (NSOperationQueue *) controlador de finalización de cola: (void (^) (nsurlresponse*, NSData*, NSError*)) controladores
O utilice un marco como AFNetworking para realizar estas operaciones de forma asincrónica.
Si necesita realizar otros tipos de operaciones que requieren grandes cantidades de recursos (como computación o almacenamiento urgente, lecturas y escrituras), utilice Grand Central Dispatch o NSOperation y NSOperationQueues.
El siguiente código es una plantilla que utiliza GCD.
^{ despacho_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0)
//Cambiar al hilo en segundo plano y realizar operaciones costosas
Dispatch_async(dispatch_get_mainqueue(), ^{
//Volver al hilo principal para actualizar la interfaz de usuario
});
p>});
¿Lo hiciste? ¿Encuentra un Dispatch_async anidado en su código? Esto se debe a que cualquier código relacionado con UIKit debe realizarse en el hilo principal.
6. Cambie el tamaño de la imagen en la vista de imagen.
Si desea mostrar una imagen del paquete en UIImageView, debe asegurarse de que el tamaño de la imagen sea el mismo que el tamaño de UIImageView. Escalar imágenes en acción requiere muchos recursos, especialmente cuando un "UIImageView" está anidado dentro de un "UIScrollView".
Si la imagen se carga desde un servicio remoto y no tienes control sobre el tamaño de la imagen, por ejemplo, si cambias su tamaño al tamaño apropiado antes de descargarla, puedes escalarla una vez después de descargarla. Es mejor usar un hilo de fondo y luego usar la imagen escalada en UIImageView.
7. Elige la serie adecuada
Aprender a elegir la clase u objeto que mejor se adapta al escenario empresarial es la base para escribir código energéticamente eficiente. Esta afirmación es especialmente cierta cuando se trata de objetos de colección.
Un resumen de algunas colecciones comunes:
Matriz: conjunto ordenado de valores. Las búsquedas que utilizan índices son rápidas, las búsquedas que utilizan valores son lentas y la inserción/eliminación es lenta.
Diccionario: almacena pares clave-valor. Encuentra más rápido con una llave.
Conjunto: Conjunto desordenado de valores. Las búsquedas por valor son rápidas, al igual que las inserciones/eliminaciones.