Preguntas para Entrevistas de Desarrollador Mobile Senior (iOS): Guía Completa

Milad Bonakdar
Autor
Domina el desarrollo avanzado de iOS con preguntas esenciales para entrevistas que cubren patrones de arquitectura, optimización del rendimiento, concurrencia, Core Data y diseño de sistemas para desarrolladores senior.
Introducción
Se espera que los desarrolladores senior de iOS diseñen aplicaciones robustas y escalables, manteniendo al mismo tiempo una alta calidad de código y rendimiento. Este rol requiere un profundo conocimiento de los frameworks de iOS, patrones de diseño, gestión de memoria y la capacidad de tomar decisiones arquitectónicas informadas.
Esta guía completa cubre preguntas esenciales de entrevistas para Desarrolladores Senior de iOS, abarcando conceptos avanzados de Swift, patrones arquitectónicos, optimización del rendimiento, concurrencia y diseño de sistemas. Cada pregunta incluye respuestas detalladas, evaluación de rareza y niveles de dificultad.
Swift Avanzado y Características del Lenguaje (6 Preguntas)
1. Explica la gestión de memoria de Swift y ARC (Automatic Reference Counting).
Respuesta: ARC gestiona automáticamente la memoria rastreando y gestionando las referencias a las instancias de clase.
- Cómo funciona: Cada instancia de clase tiene un contador de referencias. Cuando el contador llega a cero, la instancia se desasigna.
- Referencias Fuertes: Predeterminado. Aumenta el contador de referencias.
- Referencias Débiles: No aumentan el contador de referencias. Automáticamente se convierten en
nilcuando la instancia se desasigna. - Referencias No Poseídas: No aumentan el contador de referencias, pero asumen que la instancia siempre existe.
- Ciclos de Retención: Ocurren cuando dos objetos mantienen referencias fuertes entre sí, impidiendo la desasignación.
Rareza: Muy Común Dificultad: Difícil
2. ¿Qué son los Genéricos en Swift y por qué son útiles?
Respuesta: Los genéricos te permiten escribir funciones y tipos flexibles y reutilizables que pueden funcionar con cualquier tipo.
- Beneficios: Reutilización de código, seguridad de tipos, rendimiento (sin sobrecarga en tiempo de ejecución)
- Restricciones de Tipo: Restringen los tipos genéricos a protocolos o clases específicas
- Tipos Asociados: Se utilizan en protocolos para definir tipos de marcadores de posición
Rareza: Común Dificultad: Media
3. Explica la diferencia entre closures escaping y non-escaping.
Respuesta:
- Non-escaping (predeterminado): El closure se ejecuta antes de que la función regrese. El compilador puede optimizar mejor.
- Escaping (
@escaping): El closure sobrevive a la función (se almacena en una propiedad, se llama asíncronamente). Debe capturar explícitamenteself.
Rareza: Común Dificultad: Media
4. ¿Cuál es la diferencia entre map, flatMap y compactMap?
Respuesta: Estas son funciones de orden superior para transformar colecciones:
map: Transforma cada elemento y devuelve un array de resultadoscompactMap: Similar amappero filtra los valoresnilflatMap: Aplana arrays anidados en un único array
Rareza: Común Dificultad: Fácil
5. Explica los Property Wrappers en Swift.
Respuesta: Los property wrappers añaden una capa de separación entre el código que gestiona cómo se almacena una propiedad y el código que define una propiedad.
- Ejemplos Incorporados:
@State,@Published,@AppStorageen SwiftUI - Wrappers Personalizados: Definen comportamientos de propiedad reutilizables
Rareza: Media Dificultad: Difícil
6. ¿Qué es el tipo Result y cómo se utiliza?
Respuesta:
Result es un enum que representa éxito o fracaso, haciendo que el manejo de errores sea más explícito.
- Definición:
enum Result<Success, Failure: Error> - Beneficios: Manejo de errores con seguridad de tipos, contratos de API más claros, mejor que lanzar funciones para código asíncrono
Rareza: Común Dificultad: Media
Patrones de Arquitectura (5 Preguntas)
7. Explica el patrón MVVM (Model-View-ViewModel).
Respuesta: MVVM separa la lógica de la interfaz de usuario de la lógica de negocio, haciendo que el código sea más fácil de probar y mantener.
- Model: Datos y lógica de negocio
- View: UI (UIViewController, SwiftUI View)
- ViewModel: Lógica de presentación, transforma los datos del modelo para la vista
- Beneficios: Testeable (ViewModel no tiene dependencias de la UI), ViewModels reutilizables, clara separación de responsabilidades
Rareza: Muy Común Dificultad: Media
8. ¿Qué es el patrón Coordinator y por qué usarlo?
Respuesta: El patrón Coordinator separa la lógica de navegación de los controladores de vista.
- Problema: Controladores de Vista Masivos con lógica de navegación mezclada con lógica de UI
- Solución: Los Coordinators manejan el flujo de navegación
- Beneficios: Controladores de vista reutilizables, navegación testeable, flujo de aplicación claro
Rareza: Media Dificultad: Difícil
9. Explica la Inyección de Dependencias en iOS.
Respuesta: La Inyección de Dependencias es un patrón de diseño donde las dependencias se proporcionan a un objeto en lugar de crearse internamente.
- Beneficios: Testeabilidad (inyectar mocks), flexibilidad, bajo acoplamiento
- Tipos:
- Inyección de Constructor: Pasar dependencias a través del inicializador (más común)
- Inyección de Propiedad: Establecer dependencias después de la inicialización
- Inyección de Método: Pasar dependencias como parámetros de método
Rareza: Común Dificultad: Media
10. ¿Qué es el patrón Repository?
Respuesta: El patrón Repository abstrae la lógica de acceso a datos, proporcionando una API limpia para las operaciones de datos.
- Beneficios: Lógica de datos centralizada, fácil de cambiar las fuentes de datos (API, base de datos, caché), testeable
- Implementación: El repositorio coordina entre múltiples fuentes de datos
Rareza: Media Dificultad: Media
11. Explica las diferencias entre MVC, MVP y MVVM.
Respuesta:
- MVC (Model-View-Controller):
- Patrón predeterminado de Apple
- El controlador media entre el Modelo y la Vista
- Problema: Controladores de Vista Masivos
- MVP (Model-View-Presenter):
- El Presentador maneja toda la lógica de la UI
- La Vista es pasiva (solo muestra datos)
- Mejor testeabilidad que MVC
- MVVM (Model-View-ViewModel):
- El ViewModel expone flujos de datos
- La Vista se enlaza al ViewModel
- Mejor para la programación reactiva (Combine, RxSwift)
Rareza: Común Dificultad: Difícil
Rendimiento y Optimización (5 Preguntas)
12. ¿Cómo optimizas el rendimiento de la vista de tabla y la vista de colección?
Respuesta: Múltiples estrategias mejoran el rendimiento del desplazamiento:
- Reutilización de Celdas: Utiliza
dequeueReusableCellcorrectamente - Evitar Operaciones Pesadas: No realices cálculos costosos en
cellForRowAt - Optimización de Imágenes:
- Redimensiona las imágenes al tamaño de visualización
- Utiliza hilos en segundo plano para el procesamiento de imágenes
- Almacena en caché las imágenes decodificadas
- Prefetching: Implementa
UITableViewDataSourcePrefetching - Almacenamiento en Caché de Altura: Almacena en caché las alturas de las celdas calculadas
- Evitar la Transparencia: Las vistas opacas se renderizan más rápido
Rareza: Muy Común Dificultad: Media
13. Explica Instruments y cómo lo utilizas para el perfilado del rendimiento.
Respuesta: Instruments es la herramienta de análisis de rendimiento de Xcode.
- Instruments Comunes:
- Time Profiler: Identifica el código intensivo en CPU
- Allocations: Rastrea las asignaciones de memoria y las fugas
- Leaks: Detecta fugas de memoria
- Network: Supervisa la actividad de la red
- Energy Log: Analiza el uso de la batería
- Flujo de Trabajo:
- Perfilar la aplicación (Cmd+I)
- Elegir el instrumento
- Grabar e interactuar con la aplicación
- Analizar el árbol de llamadas y la línea de tiempo
- Identificar los cuellos de botella
Rareza: Común Dificultad: Media
14. ¿Cómo detectas y corriges las fugas de memoria?
Respuesta: Las fugas de memoria ocurren cuando los objetos no se desasignan cuando ya no son necesarios.
- Causas Comunes:
- Ciclos de retención (ciclos de referencia fuertes)
- Closures que capturan
selffuertemente - Delegados no marcados como
weak
- Detección:
- Herramienta Instruments Leaks
- Depurador de gráficos de memoria en Xcode
- Observar el aumento del uso de memoria
- Correcciones:
- Utiliza
weakounownedpara los delegados - Utiliza
[weak self]o[unowned self]en los closures - Romper los ciclos de retención
- Utiliza
Rareza: Muy Común Dificultad: Media
15. ¿Qué técnicas utilizas para la optimización del inicio de la aplicación?
Respuesta: Un inicio de aplicación más rápido mejora la experiencia del usuario:
- Carga Perezosa: Inicializar objetos solo cuando sea necesario
- Reducir la Carga de Dylib: Minimizar las bibliotecas dinámicas
- Optimizar
application:didFinishLaunching:- Mover el trabajo no crítico al fondo
- Aplazar la inicialización pesada
- Tamaño Binario: Un binario más pequeño se carga más rápido
- Evitar Operaciones Pesadas: No bloquear el hilo principal
- Medir: Utiliza la plantilla App Launch de Instruments
Rareza: Común Dificultad: Media
16. ¿Cómo gestionas el almacenamiento en caché y la carga de imágenes?
Respuesta: El manejo eficiente de las imágenes es crucial para el rendimiento:
- Estrategias:
- Caché de Memoria: Acceso rápido, tamaño limitado
- Caché de Disco: Persistente, mayor capacidad
- Descarga: Obtener de la red
- Librerías: SDWebImage, Kingfisher (gestionan el almacenamiento en caché automáticamente)
- Implementación Personalizada:
Rareza: Común Dificultad: Difícil
Concurrencia y Programación Asíncrona (4 Preguntas)
17. Explica async/await en Swift.
Respuesta: El modelo de concurrencia moderno de Swift introducido en Swift 5.5.
- Beneficios: Sintaxis más limpia que los completion handlers, manejo de errores más fácil, seguridad de hilos impuesta por el compilador
- Palabras Clave:
async: Marca una función que puede suspenderseawait: Marca un punto de suspensiónTask: Crea un nuevo contexto asíncronoactor: Tipo de referencia seguro para hilos
Rareza: Muy Común Dificultad: Difícil
18. ¿Qué son los Actors en Swift?
Respuesta: Los Actors son tipos de referencia que protegen su estado mutable de las carreras de datos.
- Seguridad de Hilos: Solo una tarea puede acceder al estado mutable del actor a la vez
- Sincronización Automática: El compilador impone el acceso seguro
- Main Actor: Actor especial para las actualizaciones de la UI
Rareza: Media Dificultad: Difícil
19. Explica el framework Combine.
Respuesta: Combine es el framework de programación reactiva de Apple.
- Conceptos Centrales:
- Publisher: Emite valores a lo largo del tiempo
- Subscriber: Recibe valores
- Operator: Transforma valores
- Beneficios: Declarativo, composable, operadores incorporados
- Casos de Uso: Redes, manejo de entrada del usuario, enlace de datos
Rareza: Común Dificultad: Difícil
20. ¿Cuál es la diferencia entre las colas Serial y Concurrent?
Respuesta: Las colas de despacho ejecutan tareas de forma serial o concurrente:
- Cola Serial: Ejecuta una tarea a la vez en orden FIFO. Las tareas esperan a que la tarea anterior se complete.
- Cola Concurrent: Ejecuta múltiples tareas simultáneamente. Las tareas comienzan en orden FIFO pero pueden terminar en cualquier orden.
- Cola Principal: Cola serial especial para las actualizaciones de la UI
Rareza: Común Dificultad: Media
Core Data y Persistencia (3 Preguntas)
21. Explica la arquitectura de Core Data y sus componentes principales.
Respuesta: Core Data es el framework de persistencia y gráfico de objetos de Apple.
- NSManagedObjectModel: Definición del esquema (entidades, atributos, relaciones)
- NSPersistentStoreCoordinator: Coordina entre el contexto y el almacén
- NSManagedObjectContext: Memoria de trabajo para los objetos (como un bloc de notas)
- NSPersistentStore: Almacenamiento real (SQLite, binario, en memoria)
Rareza: Común Dificultad: Media
22. ¿Cómo gestionas la concurrencia en Core Data?
Respuesta: Los contextos de Core Data no son seguros para hilos. Utiliza patrones de concurrencia adecuados:
- Tipos de Contexto:
- Contexto de Cola Principal: Para las operaciones de la UI
- Contexto de Cola Privada: Para las operaciones en segundo plano
- Buenas Prácticas:
- Nunca pases objetos gestionados entre hilos
- Utiliza
performoperformAndWaitpara las operaciones de contexto - Pasa los IDs de objeto entre los contextos
Rareza: Media Dificultad: Difícil
23. ¿Qué es NSFetchedResultsController y cuándo lo utilizas?
Respuesta:
NSFetchedResultsController gestiona eficientemente los resultados de Core Data para las vistas de tabla/colección.
- Beneficios:
- Seguimiento automático de cambios
- Eficiente en memoria (batching)
- Gestión de secciones
- Actualizaciones automáticas de la UI
- Caso de Uso: Mostrar objetos de Core Data en vistas de tabla/colección
Rareza: Media Dificultad: Media
Diseño de Sistemas y Mejores Prácticas (2 Preguntas)
24. ¿Cómo diseñarías una aplicación móvil offline-first?
Respuesta: Las aplicaciones offline-first funcionan sin Internet y se sincronizan cuando están conectadas.
- Arquitectura:
- Base de datos local como fuente de verdad (Core Data, Realm)
- Capa de sincronización para reconciliar con el servidor
- Estrategia de resolución de conflictos
- Estrategias:
- UI Optimista: Mostrar los cambios inmediatamente, sincronizar en segundo plano
- Operaciones de Cola: Almacenar las solicitudes fallidas, reintentar cuando esté en línea
- Timestamp/Versión: Rastrear la frescura de los datos
- Desafíos:
- Resolución de conflictos (última escritura gana, fusión, elección del usuario)
- Consistencia de los datos
- Límites de almacenamiento
Rareza: Media Dificultad: Difícil
25. ¿Cuáles son tus estrategias para la seguridad de la aplicación en iOS?
Respuesta: Múltiples capas protegen la aplicación y los datos del usuario:
- Protección de Datos:
- Keychain para datos sensibles (contraseñas, tokens)
- Cifrar los datos en reposo
- Utilizar la API de Protección de Datos
- Seguridad de la Red:
- Solo HTTPS (App Transport Security)
- Certificate pinning para las APIs críticas
- Validar los certificados SSL
- Seguridad del Código:
- Ofuscación para la lógica sensible
- Detección de jailbreak
- No tener secretos codificados
- Autenticación:
- Aut


