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)→viewWillAppear→viewDidAppear→viewWillDisappear→viewDidDisappear。 - 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 概念对照表
| 概念 | Android | iOS |
|---|---|---|
| 页面 | Activity | UIViewController |
| 列表 | RecyclerView | UITableView/UICollectionView |
| 声明式 UI | Jetpack Compose | SwiftUI |
| 异步主线程切换 | Handler/协程 | GCD/async-await |
| 内存管理 | GC(可达性分析) | ARC(引用计数) |
| 空安全 | Kotlin 可空类型 | Optional |
| 接口 | interface | protocol |
| 依赖管理 | Gradle | CocoaPods/SPM |
| 本地存储 | SharedPreferences/DataStore | UserDefaults |
| 包格式 | APK/AAB | IPA |
高频面试题(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++)和概念是相通的,跨端学习成本可控。不要夸大成“精通“。