一、MVC:iOS 原生架构的基石与“臃肿”困境
1. MVC 的核心模型与数据流
MVC(Model-View-Controller)是 iOS 开发中最基础、最经典的架构模式。它将程序严格划分为三个角色:Model(模型)负责管理数据和核心业务逻辑;View(视图)负责界面的渲染和用户交互反馈;Controller(控制器)则作为协调者,负责连接 Model 和 View。
在标准的数据流中,View 与 Model 之间是严格隔离的。当用户触发操作时,View 通过 Target-Action、Delegate 或 DataSource 机制将事件传递给 Controller;Controller 解析事件后调用 Model 更新数据;当 Model 发生变化时,Controller 通过 KVO(键值观察)或 Notification(通知)机制接收变更,并最终将新数据传递给 View 进行 UI 刷新。
2. iOS 平台下 MVC 的特殊性与 Massive View Controller
尽管 MVC 的设计初衷是职责分离,但在 iOS 的原生 UIKit 框架下,它却面临着严重的“臃肿”问题(即 Massive View Controller)。这主要源于苹果的设计规范:每一个界面的呈现都需要构建一个 UIViewController,且每个 ViewController 都自带一个根 View。
这种强耦合导致 Controller 承担了过多的职责。在实际开发中,ViewController 往往不仅要处理 View 的生命周期和布局,还要包揽网络请求、数据解析、业务逻辑校验以及页面路由跳转。随着业务复杂度的增加,Controller 逐渐吞噬了 Model 和 View 的部分职责,导致代码难以阅读、复用性极低,且由于 View 和 Controller 紧密绑定,单元测试变得极其困难。
二、MVVM:视图逻辑的抽离与数据驱动 UI
1. MVVM 的核心思想与架构重构
MVVM(Model-View-ViewModel)是在 MVC 基础上发展而来的架构模式,其核心思想是通过引入 ViewModel 层,彻底解决 View 与 Model 耦合过高的问题。在 MVVM 中,传统的 ViewController 被降级并划归为 View 层,View 层只负责纯粹的 UI 展示和用户交互事件的上报。
ViewModel 充当了 View 与 Model 之间的桥梁。它不持有任何 UI 框架的引用,而是专注于将 Model 中的原始数据转换为 View 可以直接使用的展示格式(如数据格式化、状态计算)。这种设计将原本堆积在 Controller 中的业务逻辑和视图状态逻辑成功抽离,实现了真正的职责分离。
2. 核心通信机制:数据绑定(Data Binding)
MVVM 区别于 MVC 的最核心特征在于数据绑定。在 MVC 中,UI 的更新是命令式的,需要 Controller 手动调用 View 的方法;而在 MVVM 中,UI 的更新是响应式的(数据驱动)。
View 与 ViewModel 之间通过数据绑定机制实现双向通信。当 ViewModel 中的数据发生变化时,View 会自动感知并刷新 UI,无需手动干预;反之,用户在 View 上的操作也会自动同步到 ViewModel。在 iOS 开发中,这种绑定可以通过多种方式实现:
- KVO(键值观察):View 监听 ViewModel 属性的变化,这是最原生的实现方式,但代码较为冗长。
- 闭包回调(Callback/Block):ViewModel 暴露闭包属性,View 在初始化时赋值,当数据变更时触发闭包更新 UI。
- 响应式编程框架:如 Combine(iOS 13+ 原生支持)或 RxSwift,通过声明式的操作符处理异步数据流,实现极其优雅的自动绑定。
3. MVVM 的内存管理与测试优势
在 MVVM 架构中,数据流向具有严格的单向性:View 引用 ViewModel,ViewModel 引用 Model,但反向引用是被绝对禁止的。ViewModel 绝不能引入任何 UIKit 的引用,这保证了 ViewModel 可以完全脱离 UI 环境进行独立的单元测试。
同时,在内存管理上需要格外谨慎。View 通常持有 ViewModel 的强引用,而 ViewModel 绝不能反向强引用 View,否则会造成循环引用(Retain Cycle)导致内存泄漏。在闭包或 KVO 回调中,必须使用 [weak self] 来打破潜在的循环引用。

339

被折叠的 条评论
为什么被折叠?



