Senior iOS Entwickler: Fragen und Antworten fürs Vorstellungsgespräch

Milad Bonakdar
Autor
Bereiten Sie sich mit praxisnahen Fragen zu Swift, SwiftUI, Architektur, Concurrency, Performance, Core Data, Offline-Sync und Sicherheit auf Senior-iOS-Interviews vor.
Einführung
In Senior-iOS-Interviews geht es darum, Swift- und Apple-Framework-Wissen mit Produktionsentscheidungen zu verbinden: Architektur, State Management, Concurrency, Performance, Persistenz, Sicherheit und saubere Trade-offs in einer echten App.
Nutzen Sie diesen Leitfaden, um Antworten zu üben, die mit der Entscheidung beginnen, den möglichen Fehlerfall erklären und das passende Werkzeug in Xcode oder im Code nennen. Eine Senior-Antwort sollte so praktisch sein, dass ein Team ihr im Code Review vertrauen kann.
Fortgeschrittene Swift- und Sprachfunktionen (6 Fragen)
1. Erklären Sie Swifts Speicherverwaltung und ARC (Automatic Reference Counting).
Antwort: ARC verwaltet den Speicher automatisch, indem es Referenzen auf Klasseninstanzen verfolgt und verwaltet.
- Funktionsweise: Jede Klasseninstanz hat einen Referenzzähler. Wenn der Zähler Null erreicht, wird die Instanz freigegeben.
- Starke Referenzen: Standard. Erhöht den Referenzzähler.
- Schwache Referenzen: Erhöhen den Referenzzähler nicht. Werden automatisch
nil, wenn die Instanz freigegeben wird. - Unowned Referenzen: Erhöhen den Referenzzähler nicht, gehen aber davon aus, dass die Instanz immer existiert.
- Retain Cycles: Treten auf, wenn zwei Objekte starke Referenzen aufeinander halten, was die Freigabe verhindert.
Seltenheit: Sehr häufig Schwierigkeit: Schwer
2. Was sind Generics in Swift und warum sind sie nützlich?
Antwort: Generics ermöglichen es Ihnen, flexible, wiederverwendbare Funktionen und Typen zu schreiben, die mit jedem Typ arbeiten können.
- Vorteile: Code-Wiederverwendbarkeit, Typsicherheit, Leistung (kein Runtime-Overhead)
- Type Constraints: Beschränken generische Typen auf bestimmte Protokolle oder Klassen
- Associated Types: Werden in Protokollen verwendet, um Platzhaltertypen zu definieren
Seltenheit: Häufig Schwierigkeit: Mittel
3. Erklären Sie den Unterschied zwischen escaping und non-escaping Closures.
Antwort:
- Non-escaping (Standard): Die Closure wird ausgeführt, bevor die Funktion zurückkehrt. Der Compiler kann besser optimieren.
- Escaping (
@escaping): Die Closure überlebt die Funktion (wird in einer Eigenschaft gespeichert, asynchron aufgerufen). Mussselfexplizit erfassen.
Seltenheit: Häufig Schwierigkeit: Mittel
4. Was ist der Unterschied zwischen map, flatMap und compactMap?
Antwort: Dies sind Higher-Order-Funktionen zur Transformation von Sammlungen:
map: Transformiert jedes Element und gibt ein Array von Ergebnissen zurückcompactMap: Wiemap, filtert abernil-Werte herausflatMap: Glättet verschachtelte Arrays zu einem einzigen Array
Seltenheit: Häufig Schwierigkeit: Einfach
5. Erklären Sie Property Wrappers in Swift.
Antwort: Property Wrappers fügen eine Trennschicht zwischen dem Code hinzu, der verwaltet, wie eine Eigenschaft gespeichert wird, und dem Code, der eine Eigenschaft definiert.
- Integrierte Beispiele:
@State,@Published,@AppStoragein SwiftUI - Benutzerdefinierte Wrapper: Definieren wiederverwendbare Eigenschaftenverhaltensweisen
Seltenheit: Mittel Schwierigkeit: Schwer
6. Was ist der Result-Typ und wie wird er verwendet?
Antwort:
Result ist eine Enum, die entweder Erfolg oder Misserfolg darstellt und die Fehlerbehandlung expliziter macht.
- Definition:
enum Result<Success, Failure: Error> - Vorteile: Typsichere Fehlerbehandlung, klarere API-Verträge, besser als Throwing Functions für asynchronen Code
Seltenheit: Häufig Schwierigkeit: Mittel
Architekturmuster (5 Fragen)
7. Erklären Sie das MVVM-Muster (Model-View-ViewModel).
Antwort: MVVM trennt die UI-Logik von der Geschäftslogik, wodurch der Code testbarer und wartbarer wird.
- Model: Daten und Geschäftslogik
- View: UI (UIViewController, SwiftUI View)
- ViewModel: Präsentationslogik, transformiert Modelldaten für die View
- Vorteile: Testbar (ViewModel hat keine UI-Abhängigkeiten), wiederverwendbare ViewModels, klare Trennung der Verantwortlichkeiten
Seltenheit: Sehr häufig Schwierigkeit: Mittel
8. Was ist das Coordinator-Muster und warum sollte man es verwenden?
Antwort: Das Coordinator-Muster trennt die Navigationslogik von den View Controllern.
- Problem: Massive View Controller mit Navigationslogik, die mit UI-Logik vermischt ist
- Lösung: Coordinators verwalten den Navigationsfluss
- Vorteile: Wiederverwendbare View Controller, testbare Navigation, klarer App-Fluss
Seltenheit: Mittel Schwierigkeit: Schwer
9. Erklären Sie Dependency Injection in iOS.
Antwort: Dependency Injection ist ein Entwurfsmuster, bei dem Abhängigkeiten einem Objekt bereitgestellt werden, anstatt intern erstellt zu werden.
- Vorteile: Testbarkeit (Inject Mocks), Flexibilität, lose Kopplung
- Typen:
- Constructor Injection: Übergabe von Abhängigkeiten über den Initializer (am häufigsten)
- Property Injection: Setzen von Abhängigkeiten nach der Initialisierung
- Method Injection: Übergabe von Abhängigkeiten als Methodenparameter
Seltenheit: Häufig Schwierigkeit: Mittel
10. Was ist das Repository-Muster?
Antwort: Das Repository-Muster abstrahiert die Datenzugriffslogik und bietet eine saubere API für Datenoperationen.
- Vorteile: Zentralisierte Datenlogik, einfaches Umschalten von Datenquellen (API, Datenbank, Cache), testbar
- Implementierung: Das Repository koordiniert zwischen mehreren Datenquellen
Seltenheit: Mittel Schwierigkeit: Mittel
11. Erklären Sie die Unterschiede zwischen MVC, MVP und MVVM.
Antwort:
- MVC (Model-View-Controller):
- Apples Standardmuster
- Der Controller vermittelt zwischen Model und View
- Problem: Massive View Controller
- MVP (Model-View-Presenter):
- Der Presenter verwaltet die gesamte UI-Logik
- Die View ist passiv (zeigt nur Daten an)
- Bessere Testbarkeit als MVC
- MVVM (Model-View-ViewModel):
- Das ViewModel stellt Datenströme bereit
- Die View bindet an das ViewModel
- Am besten für reaktive Programmierung (Combine, RxSwift)
Seltenheit: Häufig Schwierigkeit: Schwer
Leistung & Optimierung (5 Fragen)
12. Wie optimieren Sie die Leistung von Table Views und Collection Views?
Antwort: Mehrere Strategien verbessern die Scroll-Leistung:
- Cell Reuse: Verwenden Sie
dequeueReusableCellrichtig - Vermeiden Sie aufwendige Operationen: Führen Sie keine teuren Berechnungen in
cellForRowAtdurch - Bildoptimierung:
- Ändern Sie die Größe von Bildern auf die Anzeigegröße
- Verwenden Sie Hintergrundthreads für die Bildverarbeitung
- Cachen Sie dekodierte Bilder
- Prefetching: Implementieren Sie
UITableViewDataSourcePrefetching - Height Caching: Cachen Sie berechnete Zellhöhen
- Vermeiden Sie Transparenz: Opake Views rendern schneller
Seltenheit: Sehr häufig Schwierigkeit: Mittel
13. Erklären Sie Instruments und wie Sie es zur Leistungsprofilierung verwenden.
Antwort: Instruments ist das Tool zur Leistungsanalyse von Xcode.
- Häufig verwendete Instruments:
- Time Profiler: Identifiziert CPU-intensive Code
- Allocations: Verfolgt Speicherzuweisungen und Lecks
- Leaks: Erkennt Speicherlecks
- Network: Überwacht die Netzwerkaktivität
- Energy Log: Analysiert den Batterieverbrauch
- Workflow:
- App profilieren (Cmd+I)
- Instrument auswählen
- Aufzeichnen und mit der App interagieren
- Aufrufbaum und Zeitachse analysieren
- Engpässe identifizieren
Seltenheit: Häufig Schwierigkeit: Mittel
14. Wie erkennen und beheben Sie Speicherlecks?
Antwort: Speicherlecks treten auf, wenn Objekte nicht freigegeben werden, wenn sie nicht mehr benötigt werden.
- Häufige Ursachen:
- Retain Cycles (starke Referenzzyklen)
- Closures, die
selfstark erfassen - Delegates, die nicht als
weakgekennzeichnet sind
- Erkennung:
- Instruments Leaks Tool
- Memory Graph Debugger in Xcode
- Beobachten Sie den steigenden Speicherverbrauch
- Behebungen:
- Verwenden Sie
weakoderunownedfür Delegates - Verwenden Sie
[weak self]oder[unowned self]in Closures - Durchbrechen Sie Retain Cycles
- Verwenden Sie
Seltenheit: Sehr häufig Schwierigkeit: Mittel
15. Welche Techniken verwenden Sie zur Optimierung des App-Starts?
Antwort: Ein schnellerer App-Start verbessert die Benutzererfahrung:
- Lazy Loading: Initialisieren Sie Objekte nur bei Bedarf
- Reduzieren Sie das Laden von Dylibs: Minimieren Sie dynamische Bibliotheken
- Optimieren Sie
application:didFinishLaunching:- Verschieben Sie nicht-kritische Arbeiten in den Hintergrund
- Verschieben Sie die aufwendige Initialisierung
- Binärgröße: Kleinere Binärdateien werden schneller geladen
- Vermeiden Sie aufwendige Operationen: Blockieren Sie nicht den Main Thread
- Messen: Verwenden Sie die App Launch-Vorlage von Instruments
Seltenheit: Häufig Schwierigkeit: Mittel
16. Wie handhaben Sie das Caching und Laden von Bildern?
Antwort: Eine effiziente Bildverarbeitung ist entscheidend für die Leistung:
- Strategien:
- Memory Cache: Schneller Zugriff, begrenzte Größe
- Disk Cache: Persistent, größere Kapazität
- Download: Abrufen aus dem Netzwerk
- Bibliotheken: SDWebImage, Kingfisher (verwalten das Caching automatisch)
- Benutzerdefinierte Implementierung:
Seltenheit: Häufig Schwierigkeit: Schwer
Concurrency & Asynchrone Programmierung (4 Fragen)
17. Erklären Sie Async/Await in Swift.
Antwort: Swifts modernes Concurrency-Modell, das in Swift 5.5 eingeführt wurde.
- Vorteile: Sauberere Syntax als Completion Handler, einfachere Fehlerbehandlung, vom Compiler erzwungene Thread-Sicherheit
- Schlüsselwörter:
async: Markiert eine Funktion, die ausgesetzt werden kannawait: Markiert einen AussetzungspunktTask: Erstellt einen neuen asynchronen Kontextactor: Thread-sicherer Referenztyp
Seltenheit: Sehr häufig Schwierigkeit: Schwer
18. Was sind Actors in Swift?
Antwort: Actors sind Referenztypen, die ihren veränderlichen Zustand vor Data Races schützen.
- Thread-Sicherheit: Nur eine Task kann gleichzeitig auf den veränderlichen Zustand des Actors zugreifen
- Automatische Synchronisierung: Der Compiler erzwingt sicheren Zugriff
- Main Actor: Spezieller Actor für UI-Updates
Seltenheit: Mittel Schwierigkeit: Schwer
19. Erklären Sie das Combine Framework.
Antwort: Combine ist Apples Framework für reaktive Programmierung.
- Kernkonzepte:
- Publisher: Sendet Werte im Laufe der Zeit
- Subscriber: Empfängt Werte
- Operator: Transformiert Werte
- Vorteile: Deklarativ, zusammensetzbar, integrierte Operatoren
- Anwendungsfälle: Netzwerk, Benutzer-Input-Verarbeitung, Datenbindung
Seltenheit: Häufig Schwierigkeit: Schwer
20. Was ist der Unterschied zwischen Serial und Concurrent Queues?
Antwort: Dispatch Queues führen Tasks entweder seriell oder gleichzeitig aus:
- Serielle Queue: Führt jeweils eine Task in FIFO-Reihenfolge aus. Tasks warten, bis die vorherige Task abgeschlossen ist.
- Gleichzeitige Queue: Führt mehrere Tasks gleichzeitig aus. Tasks beginnen in FIFO-Reihenfolge, können aber in beliebiger Reihenfolge abgeschlossen werden.
- Main Queue: Spezielle serielle Queue für UI-Updates
Seltenheit: Häufig Schwierigkeit: Mittel
Core Data & Persistenz (3 Fragen)
21. Erklären Sie die Core Data-Architektur und ihre Hauptkomponenten.
Antwort: Core Data ist Apples Framework für Objektgraphen und Persistenz.
- NSManagedObjectModel: Schemadefinition (Entitäten, Attribute, Beziehungen)
- NSPersistentStoreCoordinator: Koordiniert zwischen Kontext und Store
- NSManagedObjectContext: Arbeitsspeicher für Objekte (wie ein Notizblock)
- NSPersistentStore: Tatsächlicher Speicher (SQLite, binär, im Speicher)
Seltenheit: Häufig Schwierigkeit: Mittel
22. Wie handhaben Sie Concurrency in Core Data?
Antwort: Core Data-Kontexte sind nicht Thread-sicher. Verwenden Sie die richtigen Concurrency-Muster:
- Kontexttypen:
- Main Queue Context: Für UI-Operationen
- Private Queue Context: Für Hintergrundoperationen
- Best Practices:
- Übergeben Sie niemals Managed Objects zwischen Threads
- Verwenden Sie
performoderperformAndWaitfür Kontextoperationen - Übergeben Sie Objekt-IDs zwischen Kontexten
Seltenheit: Mittel Schwierigkeit: Schwer
23. Was ist NSFetchedResultsController und wann verwenden Sie es?
Antwort:
NSFetchedResultsController verwaltet Core Data-Ergebnisse effizient für Table/Collection Views.
- Vorteile:
- Automatische Änderungsverfolgung
- Speichereffizient (Batching)
- Abschnittsverwaltung
- Automatische UI-Updates
- Anwendungsfall: Anzeigen von Core Data-Objekten in Table/Collection Views
Seltenheit: Mittel Schwierigkeit: Mittel
Systemdesign & Best Practices (2 Fragen)
24. Wie würden Sie eine Offline-First Mobile App entwerfen?
Antwort: Offline-First Apps funktionieren ohne Internet und werden synchronisiert, wenn eine Verbindung besteht.
- Architektur:
- Lokale Datenbank als Source of Truth (Core Data, Realm)
- Synchronisierungsschicht zur Abstimmung mit dem Server
- Strategie zur Konfliktlösung
- Strategien:
- Optimistische UI: Zeigen Sie Änderungen sofort an, synchronisieren Sie im Hintergrund
- Queue Operations: Speichern Sie fehlgeschlagene Anfragen, versuchen Sie es erneut, wenn Sie online sind
- Timestamp/Version: Verfolgen Sie die Datenaktualität
- Herausforderungen:
- Konfliktlösung (Last-Write-Wins, Merge, Benutzerauswahl)
- Datenkonsistenz
- Speicherbegrenzungen
Seltenheit: Mittel Schwierigkeit: Schwer
25. Welche Strategien haben Sie für die App-Sicherheit in iOS?
Antwort: Mehrere Ebenen schützen die App und Benutzerdaten:
- Datenschutz:
- Keychain für sensible Daten (Passwörter, Token)
- Verschlüsseln Sie Daten im Ruhezustand
- Verwenden Sie die Data Protection API
- Netzwerksicherheit:
- Nur HTTPS (App Transport Security)
- Certificate Pinning für kritische APIs
- Validieren Sie SSL-Zertifikate
- Codesicherheit:
- Obfuskierung für sensible Logik
- Jailbreak-Erkennung
- Keine fest codierten Geheimnisse
- Authentifizierung:
- Biometrische Authentifizierung (Face ID, Touch ID)
- Sichere Token-Speicherung
- Token-Aktualisierungsmechanismus
- Input-Validierung:


