Perguntas para Entrevista de Desenvolvedor Mobile Sênior (iOS): Guia Completo

Milad Bonakdar
Autor
Domine o desenvolvimento iOS avançado com perguntas essenciais para entrevistas, abrangendo padrões de arquitetura, otimização de desempenho, concorrência, Core Data e design de sistemas para desenvolvedores seniores.
Introdução
Espera-se que desenvolvedores iOS seniores arquitetem aplicações robustas e escaláveis, mantendo alta qualidade de código e desempenho. Esta função requer conhecimento profundo de frameworks iOS, padrões de design, gerenciamento de memória e a capacidade de tomar decisões arquiteturais informadas.
Este guia abrangente cobre questões essenciais de entrevista para Desenvolvedores iOS Seniores, abrangendo conceitos avançados de Swift, padrões arquiteturais, otimização de desempenho, concorrência e design de sistemas. Cada questão inclui respostas detalhadas, avaliação de raridade e classificações de dificuldade.
Swift Avançado & Recursos da Linguagem (6 Questões)
1. Explique o gerenciamento de memória do Swift e o ARC (Automatic Reference Counting).
Resposta: O ARC gerencia automaticamente a memória rastreando e gerenciando referências a instâncias de classes.
- Como funciona: Cada instância de classe tem uma contagem de referências. Quando a contagem chega a zero, a instância é desalocada.
- Referências Fortes (Strong References): Padrão. Aumenta a contagem de referências.
- Referências Fracas (Weak References): Não aumentam a contagem de referências. Automaticamente se tornam
nilquando a instância é desalocada. - Referências Não-Posseídas (Unowned References): Não aumentam a contagem de referências, mas assumem que a instância sempre existe.
- Ciclos de Retenção (Retain Cycles): Ocorrem quando dois objetos mantêm referências fortes um para o outro, impedindo a desalocação.
Raridade: Muito Comum Dificuldade: Difícil
2. O que são Generics em Swift e por que são úteis?
Resposta: Generics permitem que você escreva funções e tipos flexíveis e reutilizáveis que podem funcionar com qualquer tipo.
- Benefícios: Reutilização de código, segurança de tipo, desempenho (sem sobrecarga de tempo de execução)
- Restrições de Tipo (Type Constraints): Restringem tipos genéricos a protocolos ou classes específicas
- Tipos Associados (Associated Types): Usados em protocolos para definir tipos de placeholder
Raridade: Comum Dificuldade: Média
3. Explique a diferença entre closures escaping e non-escaping.
Resposta:
- Non-escaping (padrão): A closure é executada antes que a função retorne. O compilador pode otimizar melhor.
- Escaping (
@escaping): A closure sobrevive à função (armazenada em uma propriedade, chamada assincronamente). Deve capturar explicitamenteself.
Raridade: Comum Dificuldade: Média
4. Qual é a diferença entre map, flatMap e compactMap?
Resposta: Estas são funções de ordem superior para transformar coleções:
map: Transforma cada elemento e retorna um array de resultadoscompactMap: Comomap, mas filtra valoresnilflatMap: Achata arrays aninhados em um único array
Raridade: Comum Dificuldade: Fácil
5. Explique Property Wrappers em Swift.
Resposta: Property wrappers adicionam uma camada de separação entre o código que gerencia como uma propriedade é armazenada e o código que define uma propriedade.
- Exemplos Built-in:
@State,@Published,@AppStorageem SwiftUI - Wrappers Customizados: Defina comportamentos de propriedade reutilizáveis
Raridade: Média Dificuldade: Difícil
6. O que é o tipo Result e como ele é usado?
Resposta:
Result é um enum que representa sucesso ou falha, tornando o tratamento de erros mais explícito.
- Definição:
enum Result<Success, Failure: Error> - Benefícios: Tratamento de erros type-safe, contratos de API mais claros, melhor do que funções que lançam erros para código assíncrono
Raridade: Comum Dificuldade: Média
Padrões de Arquitetura (5 Questões)
7. Explique o padrão MVVM (Model-View-ViewModel).
Resposta: MVVM separa a lógica da UI da lógica de negócios, tornando o código mais testável e manutenível.
- Model: Dados e lógica de negócios
- View: UI (UIViewController, SwiftUI View)
- ViewModel: Lógica de apresentação, transforma dados do modelo para a view
- Benefícios: Testável (ViewModel não tem dependências da UI), ViewModels reutilizáveis, separação clara de responsabilidades
Raridade: Muito Comum Dificuldade: Média
8. O que é o padrão Coordinator e por que usá-lo?
Resposta: O padrão Coordinator separa a lógica de navegação dos view controllers.
- Problema: View Controllers Massivos com lógica de navegação misturada com lógica de UI
- Solução: Coordinators gerenciam o fluxo de navegação
- Benefícios: View controllers reutilizáveis, navegação testável, fluxo de aplicativo claro
Raridade: Média Dificuldade: Difícil
9. Explique Injeção de Dependência em iOS.
Resposta: Injeção de Dependência é um padrão de design onde as dependências são fornecidas a um objeto em vez de serem criadas internamente.
- Benefícios: Testabilidade (injetar mocks), flexibilidade, acoplamento fraco
- Tipos:
- Injeção de Construtor: Passar dependências via inicializador (mais comum)
- Injeção de Propriedade: Definir dependências após a inicialização
- Injeção de Método: Passar dependências como parâmetros de método
Raridade: Comum Dificuldade: Média
10. O que é o padrão Repository?
Resposta: O padrão Repository abstrai a lógica de acesso a dados, fornecendo uma API limpa para operações de dados.
- Benefícios: Lógica de dados centralizada, fácil de trocar fontes de dados (API, banco de dados, cache), testável
- Implementação: Repository coordena entre múltiplas fontes de dados
Raridade: Média Dificuldade: Média
11. Explique as diferenças entre MVC, MVP e MVVM.
Resposta:
- MVC (Model-View-Controller):
- Padrão padrão da Apple
- Controller medeia entre Model e View
- Problema: View Controllers Massivos
- MVP (Model-View-Presenter):
- Presenter gerencia toda a lógica da UI
- View é passiva (apenas exibe dados)
- Melhor testabilidade que MVC
- MVVM (Model-View-ViewModel):
- ViewModel expõe fluxos de dados
- View se liga ao ViewModel
- Melhor para programação reativa (Combine, RxSwift)
Raridade: Comum Dificuldade: Difícil
Desempenho & Otimização (5 Questões)
12. Como você otimiza o desempenho de table view e collection view?
Resposta: Múltiplas estratégias melhoram o desempenho de rolagem:
- Reutilização de Células: Use
dequeueReusableCellcorretamente - Evite Operações Pesadas: Não execute cálculos caros em
cellForRowAt - Otimização de Imagens:
- Redimensione imagens para o tamanho de exibição
- Use threads de fundo para processamento de imagem
- Armazene em cache imagens decodificadas
- Pré-busca: Implemente
UITableViewDataSourcePrefetching - Cache de Altura: Armazene em cache as alturas de células calculadas
- Evite Transparência: Views opacas renderizam mais rápido
Raridade: Muito Comum Dificuldade: Média
13. Explique instruments e como você os usa para profiling de desempenho.
Resposta: Instruments é a ferramenta de análise de desempenho do Xcode.
- Instruments Comuns:
- Time Profiler: Identifica código intensivo em CPU
- Allocations: Rastreia alocações de memória e vazamentos
- Leaks: Detecta vazamentos de memória
- Network: Monitora a atividade de rede
- Energy Log: Analisa o uso da bateria
- Fluxo de Trabalho:
- Fazer profiling do aplicativo (Cmd+I)
- Escolher instrumento
- Gravar e interagir com o aplicativo
- Analisar a árvore de chamadas e a linha do tempo
- Identificar gargalos
Raridade: Comum Dificuldade: Média
14. Como você detecta e corrige vazamentos de memória?
Resposta: Vazamentos de memória ocorrem quando objetos não são desalocados quando não são mais necessários.
- Causas Comuns:
- Ciclos de retenção (ciclos de referência fortes)
- Closures capturando
selffortemente - Delegates não marcados como
weak
- Detecção:
- Ferramenta Instruments Leaks
- Memory Graph Debugger no Xcode
- Observar o aumento do uso de memória
- Correções:
- Use
weakouunownedpara delegates - Use
[weak self]ou[unowned self]em closures - Quebrar ciclos de retenção
- Use
Raridade: Muito Comum Dificuldade: Média
15. Quais técnicas você usa para otimização de inicialização do aplicativo?
Resposta: Uma inicialização mais rápida do aplicativo melhora a experiência do usuário:
- Carregamento Preguiçoso (Lazy Loading): Inicialize objetos apenas quando necessário
- Reduzir Carregamento de Dylib: Minimize bibliotecas dinâmicas
- Otimizar
application:didFinishLaunching:- Mova o trabalho não crítico para o fundo
- Adie a inicialização pesada
- Tamanho do Binário: Binário menor carrega mais rápido
- Evite Operações Pesadas: Não bloqueie a thread principal
- Medir: Use o template App Launch do Instruments
Raridade: Comum Dificuldade: Média
16. Como você lida com o cache e o carregamento de imagens?
Resposta: O tratamento eficiente de imagens é crucial para o desempenho:
- Estratégias:
- Cache de Memória: Acesso rápido, tamanho limitado
- Cache de Disco: Persistente, maior capacidade
- Download: Buscar da rede
- Bibliotecas: SDWebImage, Kingfisher (gerenciam o cache automaticamente)
- Implementação Customizada:
Raridade: Comum Dificuldade: Difícil
Concorrência & Programação Assíncrona (4 Questões)
17. Explique async/await em Swift.
Resposta: Modelo de concorrência moderno do Swift introduzido no Swift 5.5.
- Benefícios: Sintaxe mais limpa que completion handlers, tratamento de erros mais fácil, segurança de thread imposta pelo compilador
- Palavras-chave:
async: Marca uma função que pode suspenderawait: Marca um ponto de suspensãoTask: Cria um novo contexto assíncronoactor: Tipo de referência thread-safe
Raridade: Muito Comum Dificuldade: Difícil
18. O que são Actors em Swift?
Resposta: Actors são tipos de referência que protegem seu estado mutável de data races.
- Segurança de Thread: Apenas uma tarefa pode acessar o estado mutável do actor por vez
- Sincronização Automática: O compilador impõe acesso seguro
- Main Actor: Actor especial para atualizações da UI
Raridade: Média Dificuldade: Difícil
19. Explique o framework Combine.
Resposta: Combine é o framework de programação reativa da Apple.
- Conceitos Principais:
- Publisher: Emite valores ao longo do tempo
- Subscriber: Recebe valores
- Operator: Transforma valores
- Benefícios: Declarativo, composable, operadores built-in
- Casos de Uso: Networking, tratamento de entrada do usuário, data binding
Raridade: Comum Dificuldade: Difícil
20. Qual é a diferença entre filas Serial e Concurrent?
Resposta: Filas de despacho executam tarefas serialmente ou concorrentemente:
- Fila Serial: Executa uma tarefa por vez em ordem FIFO. As tarefas esperam que a tarefa anterior seja concluída.
- Fila Concorrente: Executa várias tarefas simultaneamente. As tarefas começam em ordem FIFO, mas podem terminar em qualquer ordem.
- Fila Principal (Main Queue): Fila serial especial para atualizações da UI
Raridade: Comum Dificuldade: Média
Core Data & Persistência (3 Questões)
21. Explique a arquitetura do Core Data e seus principais componentes.
Resposta: Core Data é o framework de gráfico de objetos e persistência da Apple.
- NSManagedObjectModel: Definição de esquema (entidades, atributos, relacionamentos)
- NSPersistentStoreCoordinator: Coordena entre o contexto e o armazenamento
- NSManagedObjectContext: Memória de trabalho para objetos (como um rascunho)
- NSPersistentStore: Armazenamento real (SQLite, binário, na memória)
Raridade: Comum Dificuldade: Média
22. Como você lida com concorrência no Core Data?
Resposta: Os contextos do Core Data não são thread-safe. Use padrões de concorrência adequados:
- Tipos de Contexto:
- Contexto da Fila Principal (Main Queue Context): Para operações da UI
- Contexto da Fila Privada (Private Queue Context): Para operações em segundo plano
- Melhores Práticas:
- Nunca passe objetos gerenciados entre threads
- Use
performouperformAndWaitpara operações de contexto - Passe IDs de objetos entre contextos
Raridade: Média Dificuldade: Difícil
23. O que é NSFetchedResultsController e quando você o usa?
Resposta:
NSFetchedResultsController gerencia eficientemente os resultados do Core Data para table/collection views.
- Benefícios:
- Rastreamento automático de alterações
- Eficiência de memória (batching)
- Gerenciamento de seção
- Atualizações automáticas da UI
- Caso de Uso: Exibição de objetos Core Data em table/collection views
Raridade: Média Dificuldade: Média
Design de Sistemas & Melhores Práticas (2 Questões)
24. Como você projetaria um aplicativo móvel offline-first?
Resposta: Aplicativos offline-first funcionam sem internet e sincronizam quando conectados.
- Arquitetura:
- Banco de dados local como fonte da verdade (Core Data, Realm)
- Camada de sincronização para reconciliar com o servidor
- Estratégia de resolução de conflitos
- Estratégias:
- UI Otimista: Mostrar alterações imediatamente, sincronizar em segundo plano
- Operações em Fila: Armazenar solicitações com falha, tentar novamente quando online
- Timestamp/Versão: Rastrear a atualização dos dados
- Desafios:
- Resolução de conflitos (última gravação vence, mesclar, escolha do usuário)
- Consistência de dados
- Limites de armazenamento
Raridade: Média Dificuldade: Difícil
25. Quais são suas estratégias para segurança de aplicativos em iOS?
Resposta: Múltiplas camadas protegem o aplicativo e os dados do usuário:
- Proteção de Dados:
- Keychain para dados confidenciais (senhas, tokens)


