iOS Developer

Updated for 2026: iOS Developer interview questions and answers covering core skills, tools, and best practices for roles in the US, Europe & Canada.

20 Questions
hardios-arc-memory-management

How does ARC work in iOS and what causes retain cycles?

ARC automatically manages reference counting for objects. Retain cycles happen when two objects strongly reference each other (common with closures and delegates). Fixes: - Use `weak`/`unowned` where appropriate - Break cycles in callbacks - Be careful with long-lived singletons capturing view controllers Interview tip: explain a closure capturing `self` inside a view controller and how to fix it.

SwiftMemoryiOS
mediumios-struct-vs-class

Swift struct vs class: what are the differences and when do you use each?

Structs are value types; classes are reference types. Use structs for immutable models and safer concurrency. Use classes when you need identity, inheritance, or shared mutable state. Practical rule: default to structs, use classes for UIKit objects, coordinators, and reference semantics where required.

SwiftiOSArchitecture
mediumios-uikit-vs-swiftui

UIKit vs SwiftUI: what are the trade-offs and when do you choose each?

UIKit is mature and flexible; SwiftUI is declarative and faster to iterate. SwiftUI benefits: previews, state-driven UI, less boilerplate. UIKit benefits: full control, stability, legacy codebases. Many teams use hybrid apps: SwiftUI for new screens, UIKit for complex flows and existing infrastructure.

iOSUIKitSwiftUI
easyios-view-controller-lifecycle

Explain the UIViewController lifecycle and common pitfalls.

Key lifecycle methods include `viewDidLoad`, `viewWillAppear`, `viewDidAppear`, and their disappearing counterparts. Pitfalls: - Starting heavy work on the main thread in `viewDidLoad` - Duplicating network calls in `viewWillAppear` - Not cancelling tasks on disappearance A good pattern is to start one-time setup in `viewDidLoad` and refresh lightweight UI state in `viewWillAppear`.

iOSUIKitLifecycle
hardios-concurrency-async-await

How does concurrency work in Swift (async/await, actors) and what problems does it solve?

Swift concurrency uses async/await for structured async code and actors to protect mutable state. Benefits: - Fewer callback pyramids - Clear cancellation and error propagation - Safer shared state (actors) Interview tip: mention avoiding UI updates off the main actor and using tasks responsibly to prevent leaks.

SwiftConcurrencyiOS
mediumios-networking-urlsession

How do you design networking on iOS (URLSession, retries, caching, error handling)?

A robust networking layer wraps URLSession with consistent request/response handling. Include: - Typed endpoints and decoding - Timeouts and retry policies (idempotent only) - Caching when safe - Auth token refresh - Clear error mapping for UI Keep the API surface small and testable with mock sessions.

NetworkingiOSArchitecture
mediumios-core-data-basics

Core Data: what is it and what are common mistakes developers make?

Core Data is an object graph and persistence framework. Common mistakes: - Doing heavy fetches on the main thread - Mismanaging contexts and merges - Forgetting migrations Use background contexts for writes, batch fetches for performance, and plan migrations early to keep upgrades smooth.

Core DataPersistenceiOS
hardios-keychain-security

How do you store tokens securely on iOS using Keychain?

Keychain stores secrets encrypted and protected by the OS. Best practices: - Use appropriate accessibility levels (e.g., after first unlock) - Avoid logging tokens - Rotate tokens and support logout - Consider Secure Enclave for higher assurance use cases Also design server-side revocation because local deletion alone is not enough.

SecurityKeychainiOS
mediumios-push-notifications-apns

How do APNs push notifications work on iOS?

APNs delivers notifications using device tokens. Flow: - App registers for remote notifications - Receives a device token - Your server sends payloads to APNs with that token Important: handle permission prompts thoughtfully, support token refresh, and implement deep links and analytics for opens.

NotificationsAPNsiOS
hardios-background-processing

How does background processing work on iOS and how do you schedule work reliably?

iOS limits background execution to protect battery. Use: - BackgroundTasks framework (BGAppRefreshTask/BGProcessingTask) - Background URLSession for uploads/downloads Design work to be resumable, idempotent, and respectful of constraints (network/power). Expect scheduling to be opportunistic, not guaranteed.

Background TasksPerformanceiOS
mediumios-universal-links

Universal Links: how do they work and how do you implement them?

Universal Links open your app for HTTPS URLs you own. Steps: - Host an apple-app-site-association file - Configure associated domains in the app - Route URLs safely in-app They’re more reliable than custom URL schemes and reduce link hijacking. Always validate parameters and enforce auth for sensitive screens.

Deep LinkingiOSSecurity
mediumios-testing-xctest

How do you test iOS apps (unit tests vs UI tests) effectively?

Use a layered testing strategy. - Unit tests (XCTest) for logic - Integration tests for networking/persistence - UI tests for critical flows Keep UI tests minimal to avoid flakiness. Use mocks/fixtures, deterministic data, and run tests in CI with reliable simulators.

TestingXCTestiOS
hardios-instruments-profiling

How do you use Instruments to diagnose performance issues in iOS apps?

Instruments helps find CPU, memory, and UI performance problems. Common tools: - Time Profiler (CPU hotspots) - Allocations/Leaks (memory) - Network (requests) - Core Animation (frame drops) Start from a reproducible scenario, capture a trace, then fix the hottest path and re-measure.

PerformanceProfilingiOS
easyios-accessibility-voiceover

How do you make iOS apps accessible for VoiceOver users?

Accessibility improves usability and often reduces support issues. Practices: - Provide meaningful accessibility labels/hints - Use Dynamic Type and support text scaling - Ensure sufficient contrast - Keep focus order logical Test using VoiceOver and Accessibility Inspector. Avoid custom controls without proper accessibility traits.

AccessibilityVoiceOveriOS
mediumios-code-signing-provisioning

Explain iOS code signing, certificates, and provisioning profiles.

Code signing proves the app is from a trusted developer and hasn’t been tampered with. You typically work with: - Certificates (identity) - App IDs and entitlements - Provisioning profiles (device + certificate + app) Understanding signing helps debug CI build failures, TestFlight issues, and App Store submission problems.

ReleaseiOSCI/CD
easyios-app-store-review

What are common App Store review rejections and how do you avoid them?

Common rejections include privacy issues, broken flows, misleading metadata, and improper subscription/IAP behavior. Avoid them by: - Testing on real devices - Providing clear permission rationale - Ensuring paywalls and subscriptions follow guidelines - Keeping privacy policy and data collection accurate Always include reviewer notes for test accounts and required steps.

ReleaseComplianceiOS
mediumios-localization

What are best practices for localization and internationalization in iOS apps?

Localization is more than translating strings. Best practices: - Use NSLocalizedString with stable keys - Support pluralization - Format dates/numbers/currency via locale - Test long strings and RTL layouts Avoid hard-coded concatenation and ensure the UI adapts to language direction and font changes.

i18nUXiOS
hardios-mvvm-coordinator

How do MVVM and the Coordinator pattern help structure iOS apps?

MVVM separates UI from presentation logic, improving testability. Coordinators move navigation logic out of view controllers, reducing massive controllers and making flows easier to manage. Together they: - Improve separation of concerns - Simplify testing - Scale better for larger teams Interview tip: describe where business logic lives and how navigation is coordinated.

ArchitectureMVVMiOS
hardios-offline-sync

How do you implement offline sync on iOS with Core Data or SQLite?

Offline sync uses local persistence plus a sync engine. Typical design: - Save server data into Core Data/SQLite - Track local changes in an outbox table - Sync changes when online (with retries) - Resolve conflicts deterministically Keep sync incremental and observable (logs/metrics) so you can diagnose stuck queues and data drift.

OfflineCore DataiOS
mediumios-protocol-oriented-programming

What is protocol-oriented programming in Swift and when is it useful?

Protocol-oriented programming uses protocols + extensions to share behavior. Benefits: - Composition over inheritance - Better testability via protocol abstractions - Reusable default implementations It’s useful for building modular systems (network clients, repositories) and for decoupling app layers without deep class hierarchies.

SwiftArchitectureiOS