Phỏng vấn iOS chuyên sâu: câu hỏi kỹ thuật thường gặp và cách trả lời
Vòng phỏng vấn kỹ thuật iOS thường xoáy vào những phần thể hiện bạn hiểu sâu nền tảng: ngôn ngữ Swift, quản lý bộ nhớ với ARC, xử lý đồng thời, cách SwiftUI và UIKit hoạt động, kiến trúc ứng dụng và tối ưu hiệu năng. Bài viết này tập trung hoàn toàn vào phần kỹ thuật, liệt kê các nhóm câu hỏi thường gặp kèm gợi ý hướng trả lời, giúp bạn ôn có hệ thống. Phần chuẩn bị hồ sơ, portfolio và vòng HR được trình bày riêng trong bài chuẩn bị hồ sơ và vòng HR cho vị trí iOS.
Swift: nền tảng ngôn ngữ
Value type và reference type
Câu hỏi gần như chắc chắn gặp: struct khác class thế nào? Hướng trả lời: struct là value type, được sao chép khi gán hoặc truyền; class là reference type, các biến cùng trỏ đến một đối tượng. Struct không có kế thừa, an toàn hơn trong môi trường đa luồng vì mỗi bản sao độc lập. Nên nhắc đến copy-on-write của các kiểu như Array, Dictionary để cho thấy bạn hiểu hiệu năng. Khi nào dùng class: cần định danh, kế thừa, chia sẻ trạng thái, tương tác với API Objective-C.
Các câu hỏi Swift khác
- Optional là gì; các cách unwrap: if let, guard let, ??, optional chaining; vì sao hạn chế force unwrap.
- Protocol, protocol extension, lập trình hướng protocol.
- Generics và associated type.
- Closure, escaping và non-escaping closure.
- Enum có associated value, pattern matching với switch.
- Access control: private, fileprivate, internal, public, open.
- Error handling: throws, try, Result.
Quản lý bộ nhớ: ARC và retain cycle
Đây là chủ đề phân loại ứng viên rõ rệt. Cần giải thích được:
- ARC (Automatic Reference Counting) đếm số tham chiếu mạnh tới đối tượng, giải phóng khi về 0.
- Retain cycle xảy ra khi hai đối tượng giữ tham chiếu mạnh lẫn nhau, hoặc closure giữ self mạnh trong khi self giữ closure.
- Cách phá vòng: weak (tự thành nil, phải là optional) và unowned (không thành nil, dùng khi chắc chắn đối tượng sống lâu hơn).
- Capture list [weak self] trong closure; delegate thường khai báo weak.
- Cách phát hiện rò rỉ: Memory Graph Debugger trong Xcode, Instruments (Leaks, Allocations).
Xử lý đồng thời (concurrency)
| Chủ đề | Cần nắm |
|---|---|
| Main thread | Mọi cập nhật giao diện phải trên main thread; @MainActor |
| GCD | DispatchQueue, serial và concurrent queue, sync và async, DispatchGroup |
| Swift Concurrency | async/await, Task, TaskGroup, structured concurrency, hủy tác vụ |
| Actor | Bảo vệ trạng thái khỏi data race; Sendable |
| Vấn đề kinh điển | Race condition, deadlock, priority inversion và cách tránh |
Người phỏng vấn có thể đưa một đoạn code tải dữ liệu rồi cập nhật giao diện, hỏi lỗi nằm ở đâu. Hãy kiểm tra luồng cập nhật UI, retain cycle trong closure, và việc xử lý lỗi, hủy tác vụ.
UIKit và SwiftUI
UIKit
- Vòng đời UIViewController: viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear…
- Auto Layout, constraint, intrinsic content size.
- UITableView, UICollectionView: tái sử dụng cell, diffable data source, tối ưu cuộn.
- Responder chain, hit-testing ở mức cơ bản.
SwiftUI
- View là struct, mô tả giao diện theo trạng thái.
- Quản lý trạng thái: @State, @Binding, @StateObject và @ObservedObject (hoặc @Observable trong các phiên bản mới), @Environment.
- Khi nào view được tính lại và cách tránh cập nhật thừa.
- Kết hợp SwiftUI với UIKit qua UIViewRepresentable, UIHostingController.
Kiến trúc và thiết kế
Các câu hỏi thường gặp: so sánh MVC, MVVM, VIPER, TCA; vì sao Massive View Controller là vấn đề; cách tổ chức tầng mạng, tầng dữ liệu; dependency injection; viết code có thể test. Ở cấp middle trở lên có thể gặp câu hỏi thiết kế: "Thiết kế màn hình bảng tin có ảnh, hỗ trợ ngoại tuyến" hay "Thiết kế module thanh toán". Hãy làm rõ yêu cầu, vẽ các thành phần, giải thích luồng dữ liệu, chiến lược cache, xử lý lỗi và đánh đổi.
Hiệu năng và công cụ
- Dùng Instruments: Time Profiler, Allocations, Leaks.
- Nguyên nhân cuộn giật: xử lý nặng trên main thread, ảnh quá lớn, layout phức tạp.
- Tối ưu khởi động ứng dụng, giảm công việc trong quá trình khởi chạy.
- Lưu trữ: UserDefaults, Keychain cho dữ liệu nhạy cảm, Core Data hoặc SwiftData, tệp.
Bảo mật, quyền riêng tư và phát hành
Với các vị trí ở fintech hoặc ứng dụng có dữ liệu nhạy cảm, câu hỏi về bảo mật xuất hiện thường xuyên. Bạn nên giải thích được vì sao lưu token, mật khẩu trong Keychain thay vì UserDefaults, App Transport Security yêu cầu gì với kết nối mạng, cách xác thực bằng Face ID qua LocalAuthentication, và khái niệm certificate pinning ở mức cơ bản. Hiểu về quyền riêng tư cũng quan trọng: khai báo lý do xin quyền trong Info.plist, App Tracking Transparency, nhãn quyền riêng tư trên App Store và tệp privacy manifest.
Một nhóm câu hỏi khác liên quan quy trình phát hành: provisioning profile, certificate, bundle identifier, TestFlight, các nguyên nhân phổ biến khiến ứng dụng bị từ chối khi gửi duyệt. Ứng viên từng tự phát hành ứng dụng thường trả lời phần này tự tin hơn hẳn, vì đã trực tiếp xử lý những lỗi ký mã và phản hồi từ App Review.
Live coding: cách thể hiện tốt
- Hỏi lại để làm rõ đề bài và trường hợp biên.
- Nói ra cách tiếp cận trước khi viết.
- Viết code rõ ràng, đặt tên có nghĩa.
- Tự kiểm tra với vài ví dụ, nêu độ phức tạp thời gian và bộ nhớ.
- Nếu bí, nói ra chỗ đang vướng; người phỏng vấn thường gợi ý.
Kế hoạch ôn tập gợi ý
Chia các chủ đề trên thành từng tuần, mỗi chủ đề vừa đọc tài liệu chính thức của Apple vừa viết code thử nghiệm nhỏ. Tự giải thích lại bằng lời như đang trả lời phỏng vấn. Ôn thuật toán cơ bản song song. Cách sắp xếp thời gian ôn tập hiệu quả xem trong bài quản lý thời gian hiệu quả, và để hiểu bức tranh nghề nghiệp dài hạn, xem bài cơ hội việc làm mảng iOS.
Câu hỏi thường gặp
Phỏng vấn iOS nên ôn UIKit hay SwiftUI?
Nên ôn cả hai. Nhiều ứng dụng đang chạy vẫn dùng UIKit, trong khi dự án mới ưu tiên SwiftUI. Hãy hỏi trước nhà tuyển dụng dự án của họ dùng gì để ưu tiên phần ôn tập.
Weak và unowned khác nhau thế nào?
Cả hai đều không tăng số tham chiếu. Weak là optional và tự thành nil khi đối tượng bị giải phóng; unowned không phải optional và sẽ gây crash nếu truy cập sau khi đối tượng đã giải phóng. Dùng unowned chỉ khi chắc chắn vòng đời đối tượng.
Có cần biết Objective-C khi phỏng vấn iOS?
Không bắt buộc với phần lớn vị trí mới, nhưng biết đọc Objective-C là lợi thế ở công ty có ứng dụng lâu năm. Kiến thức về runtime và tương tác Swift với Objective-C đôi khi được hỏi ở cấp cao hơn.
Bài liên quan

Cách quản lý thời gian hiệu quả cho sinh viên ngành Marketing
Sinh viên Marketing quản lý thời gian thế nào giữa học, dự án nhóm, thực tập, làm thêm: lập kế hoạch theo tuần, chia khối thời gian, xử lý deadline dồn dập.

Cách quản lý thời gian hiệu quả cho sinh viên ngành Tài chính
Quản lý thời gian cho sinh viên Tài chính: học môn định lượng, ôn chứng chỉ, luyện Excel, thực tập, lập lịch ôn tập dài hạn, tránh dồn bài cuối kỳ.

Cơ hội việc làm lập trình Android trong 5 năm tới: phân tích sâu
Phân tích cơ hội nghề lập trình viên Android: nhu cầu từ đâu, kỹ năng Kotlin, Jetpack Compose, đa nền tảng, AI, các hướng phát triển và lộ trình cho người mới.

Cơ hội việc làm lập trình iOS trong 5 năm tới
Phân tích cơ hội nghề lập trình iOS: nơi tuyển dụng, Swift, SwiftUI, hệ sinh thái Apple, AI trên thiết bị, hướng phát triển và cách chuẩn bị.