¿Cuáles son los errores comunes que cometen los nuevos desarrolladores de iOS?

Mal entendiendo procesos asincrónicos

Esto es muy común cuando se reciben datos de una API del lado del servidor. Por lo general, verá el método de visualización para mostrar los datos colocados justo después de la llamada asincrónica. No funcionará: la llamada asíncrona tardará más en completarse, y cuando lo haga, el método de vista ya ha sido llamado. Los bloques de finalización y los cierres rápidos hoy en día hacen que sea más fácil evitar este tipo de error, pero aún veo mucha confusión por parte de los programadores junior.

Operaciones de IU en un subproceso diferente de la cola principal

UIKit no es seguro para subprocesos. Algunos programadores no lo saben. Pero incluso cuando lo saben, es muy común que pierdan la noción de en qué hilo están operando, especialmente cuando hacen llamadas asincrónicas. Terminan realizando operaciones de IU en diferentes subprocesos, lo que conduce a un comportamiento inesperado.

Controladores de vista masiva

Por lo general, incluirán la mayor parte de la lógica empresarial en el Controlador y tendrán Modelos y Vistas muy delgados. Este es un gran error arquitectónico que solo empeora a medida que el proyecto evoluciona.

Los modelos no solo están ahí para representar el estado, sino también para tener lógica. Una lógica que en realidad se puede reutilizar en muchos Controladores diferentes cuando se opera con esos modelos.

Las vistas también deben tener una lógica relacionada con la vista definida en sí mismas y no manejada por el controlador. Un ejemplo típico de lo que no se debe hacer son UITableViewCells personalizadas, donde verá docenas de líneas de código para configurar la celda … en el Controlador.

Reutilización incorrecta de UITableViewCell y UICollectionViewCell

La mayoría de las veces, estos objetos se reutilizan al desplazarse: significa no crear nuevos, sino reutilizar los ya asignados en la memoria y configurarlos para mostrar los datos adecuados. Los nuevos desarrolladores a menudo no obtienen esta parte de reutilización correctamente. Muchas veces las personas se olvidan de, por ejemplo, limpiar algunas variables cuando no hay datos para ellas, lo que hace que algunas celdas muestren información incorrecta.

Comparación de objetos en Objective-C

Este es un error muy frecuente al comparar objetos (principalmente ocurre con NSStrinf y NSDate) usando el operador ==. Lo que está haciendo este operador es la comparación de punteros: comparar la dirección de memoria de los dos objetos. No está haciendo una comparación semántica: comparar si dos cadenas tienen los mismos caracteres. Para la comparación semántica, isEqual se implementa en la clase NSString.

Introducir ciclos de retención

Hay dos escenarios comunes donde esto sucede:

  1. Delegados Por lo general, sucederá que un ParentViewController esté configurado como delegado de su ChildViewController. Al definir el delegado en ChildViewController, la mayoría lo configurará como fuerte, lo que provocará ciclos de retención porque ahora ambos controladores se retienen entre sí.
  2. Bloques / Cierres: Asignar un bloque como una propiedad en la clase y también hacer que este bloque llame a la clase por sí mismo. La solución típica es referirse a una referencia débil de uno mismo dentro del código de bloque.

Solo pruebas en el simulador

Es una práctica realmente mala pensar que porque funciona en el simulador, ya está hecho. Muchas cosas diferentes pueden variar en el comportamiento del simulador al dispositivo. Pasa del código roto debido a diferentes arcos de memoria (32 frente a 64) a problemas de rendimiento (el simulador es mucho más rápido que un dispositivo real).

Ignorando los patrones de diseño. ¡Resultados en ViewControllers excesivos!