Phỏng vấn lập trình di động native: vòng đời, bộ nhớ và bất đồng bộ trên Android và iOS

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Dù Flutter và React Native phổ biến, nhiều công ty vẫn tuyển lập trình viên native cho Android (Kotlin) và iOS (Swift). Các câu hỏi phỏng vấn thường xoay quanh vòng đời thành phần giao diện, quản lý bộ nhớ, xử lý bất đồng bộ và lưu trữ dữ liệu. Dưới đây là phần tổng quan cho cả hai nền tảng.

Vòng đời thành phần giao diện

Android: Activity và Fragment

Các hàm chính của Activity theo thứ tự: onCreate, onStart, onResume, rồi khi rời đi là onPause, onStop, onDestroy. Khi xoay màn hình, Activity bị hủy và tạo lại, nên trạng thái giao diện cần được lưu bằng ViewModel hoặc onSaveInstanceState. Fragment có vòng đời riêng, và view của nó có vòng đời tách biệt với bản thân Fragment, một chi tiết hay bị hỏi.

iOS: UIViewController

Các hàm quen thuộc: viewDidLoad (nạp một lần), viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear. Với SwiftUI, vòng đời thể hiện qua cách view được mô tả và các modifier như onAppear, task.

Quản lý bộ nhớ

iOS: ARC và vòng tham chiếu

Swift dùng Automatic Reference Counting: đối tượng được giải phóng khi không còn tham chiếu mạnh. Vấn đề kinh điển là retain cycle, khi hai đối tượng giữ tham chiếu mạnh lẫn nhau hoặc closure giữ self. Cách xử lý là dùng weak hoặc unowned.

class Loader {    var onDone: (() -> Void)?    func start() {        onDone = { [weak self] in            guard let self = self else { return }            self.finish()        }    }    func finish() { print("Xong") }}

Android: rò rỉ bộ nhớ

Java và Kotlin dùng bộ thu gom rác, nhưng rò rỉ vẫn xảy ra khi giữ tham chiếu tới Context hoặc Activity trong đối tượng sống lâu như singleton hoặc luồng nền. Hãy dùng Application context khi cần, hủy đăng ký listener, và theo dõi rò rỉ bằng công cụ phân tích bộ nhớ.

Bất đồng bộ

Không được thực hiện thao tác nặng như mạng, đọc ghi file trên luồng chính vì làm giao diện giật hoặc treo.

  • Android: Kotlin Coroutines và Flow, với các dispatcher như Main, IO, Default; viewModelScope và lifecycleScope tự hủy theo vòng đời.
  • iOS: Swift Concurrency với async/await, Task, actor; ngoài ra còn có Grand Central Dispatch và Combine.
// KotlinviewModelScope.launch {    val user = withContext(Dispatchers.IO) { repository.loadUser() }    _state.value = user}

Kiến trúc ứng dụng

Cả hai hệ sinh thái đều khuyến khích tách giao diện và logic. Các mô hình phổ biến là MVVM (View, ViewModel, Model), MVI và Clean Architecture. Điều quan trọng là bạn giải thích được vì sao tách lớp giúp kiểm thử dễ hơn, trạng thái ổn định qua xoay màn hình và dễ mở rộng. Hãy nói về dependency injection: Hilt hoặc Koin trên Android, khởi tạo qua constructor hoặc các container trên iOS.

Lưu trữ dữ liệu

  • Cặp khóa giá trị nhỏ: SharedPreferences hoặc DataStore trên Android, UserDefaults trên iOS.
  • Cơ sở dữ liệu cục bộ: Room (SQLite) trên Android, Core Data hoặc SwiftData trên iOS.
  • Dữ liệu nhạy cảm: dùng Keystore trên Android và Keychain trên iOS, không lưu mật khẩu hay token dạng văn bản thường.

Danh sách hiệu quả

Danh sách dài cần tái sử dụng ô: RecyclerView (hoặc LazyColumn của Jetpack Compose) trên Android, UITableView/UICollectionView (hoặc List của SwiftUI) trên iOS. Giải thích được cơ chế tái sử dụng, vai trò của ViewHolder hay dequeueReusableCell, và cách tránh công việc nặng khi cuộn sẽ là điểm cộng.

Phát hành lên cửa hàng

Hãy biết quy trình cơ bản: ký ứng dụng bằng khóa hoặc chứng chỉ, tạo bản build phát hành, kiểm thử nội bộ, đẩy lên Google Play Console hoặc App Store Connect, tuân thủ chính sách và hướng dẫn của từng cửa hàng. Nếu bạn từng phát hành một ứng dụng thật, đây là câu chuyện rất đáng kể.

Một số câu hỏi ngắn khác

  • Làm sao xử lý quyền truy cập camera, vị trí khi người dùng từ chối?
  • Ứng dụng hoạt động thế nào khi mất mạng? Cách đồng bộ khi có mạng lại?
  • Làm sao giảm thời gian khởi động ứng dụng?
  • Thông báo đẩy hoạt động ra sao ở mức tổng quan?

Kết luận

Dù chọn Android hay iOS, hãy hiểu chắc vòng đời, bộ nhớ, bất đồng bộ và kiến trúc. Hãy sẵn sàng trình diễn một ứng dụng thật và giải thích các quyết định kỹ thuật phía sau.

Nếu bạn muốn học lập trình di động theo lộ trình, hãy xem các khóa phù hợp tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment