Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

iOS 基础速览 (辅)

这是辅助篇,目标不是把你培养成 iOS 工程师,而是让你在面试里接得住 iOS 相关提问,展示“跨端潜力“。重点是用 Android 概念类比,快速建立对照。

一、Swift 语言基础

  • 变量:let(常量,类比 Kotlin val)、var(变量)。类型推断。
  • 可选值(Optional):var name: String?,概念等同 Kotlin 可空类型。
    • 可选绑定 if let x = name { } / guard let x = name else { return }
    • 强制解包 name!(类比 Kotlin !!)。
    • 可选链 name?.count(类比 ?.)。
    • 空合运算 name ?? "default"(类比 Elvis ?:)。
  • 闭包(Closure):类比 Kotlin Lambda,{ (x: Int) -> Int in x * 2 },尾随闭包语法。
  • 协议(Protocol):类比接口,但更强大(可扩展、面向协议编程 POP)。
  • 结构体 vs 类:struct 是值类型(拷贝),class 是引用类型。Swift 鼓励用 struct。
  • 枚举:带关联值的枚举很强大,类比 Kotlin sealed class。

二、内存管理 ARC

  • ARC(Automatic Reference Counting):编译期自动插入 retain/release,不是 GC(无运行时回收线程)。引用计数为 0 即释放。
  • 循环引用:两个对象互相强引用导致无法释放(类比内存泄漏)。
  • 解决:weak(弱引用,可为 nil)、unowned(无主引用,不为 nil)。闭包捕获用 [weak self](类比避免 Handler 持有 Activity)。
  • 与 Android 对比:Android 用 GC 可达性分析自动回收;iOS 用 ARC 引用计数,开发者需主动打破循环引用。

三、UI 体系

  • UIViewController 生命周期:viewDidLoad(类比 onCreate)→ viewWillAppearviewDidAppearviewWillDisappearviewDidDisappear
  • UIKit:命令式 UI(类比 View 体系),用 Storyboard/XIB 或纯代码。
  • SwiftUI:声明式 UI(类比 Jetpack Compose),@State/@Binding/@ObservedObject 管理状态,概念和 Compose 高度相似——你学了 Compose 就好理解。

四、并发 GCD

  • GCD(Grand Central Dispatch):iOS 的并发框架,基于队列。
  • 主队列:DispatchQueue.main,UI 操作(类比 Android 主线程/Dispatchers.Main)。
  • 全局队列:DispatchQueue.global(qos:),后台任务(类比 Dispatchers.IO/Default)。
  • 异步/同步:async(不阻塞,类比 launch)、sync(阻塞当前)。
  • 现代 Swift 也有 async/await + Task(类比 Kotlin 协程),概念可迁移。
DispatchQueue.global().async {        // 后台
    let data = loadData()
    DispatchQueue.main.async {         // 回主线程更新 UI
        self.label.text = data
    }
}

五、Android / iOS 概念对照表

概念AndroidiOS
页面ActivityUIViewController
列表RecyclerViewUITableView/UICollectionView
声明式 UIJetpack ComposeSwiftUI
异步主线程切换Handler/协程GCD/async-await
内存管理GC(可达性分析)ARC(引用计数)
空安全Kotlin 可空类型Optional
接口interfaceprotocol
依赖管理GradleCocoaPods/SPM
本地存储SharedPreferences/DataStoreUserDefaults
包格式APK/AABIPA

高频面试题(iOS 通常只是辅助考察)

Q1:iOS 的内存管理和 Android 有什么不同? iOS 用 ARC,编译期插入 retain/release 做引用计数,计数为 0 即释放,无运行时 GC 线程,需手动用 weak/unowned 打破循环引用。Android 用 GC 可达性分析在运行时回收,无需手动管理引用计数。

Q2:weak 和 unowned 区别? 都不增加引用计数。weak 引用对象释放后变 nil(可选);unowned 假设对象在引用期间一直存在,释放后访问会崩溃(非可选)。生命周期不确定用 weak,确定不短于自身用 unowned。

Q3:struct 和 class 区别? struct 是值类型(赋值/传参拷贝,栈),class 是引用类型(共享,堆,有 ARC)。Swift 优先用 struct(线程安全、无副作用)。

Q4:SwiftUI 和 Compose 像吗? 非常像。都是声明式、状态驱动、UI=f(state)、单向数据流。@State 类比 remember+mutableStateOf,@Binding 类比状态提升。理解了 Compose 基本能迁移过去。

Q5:你做过 iOS 吗?能转吗?(开放题) 诚实说做过部分 iOS,理解 Swift/UIKit/ARC 基础,有跨端经验;强调底层(C/C++)和概念是相通的,跨端学习成本可控。不要夸大成“精通“。