<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>架构 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%9E%B6%E6%9E%84/</link><description>Recent content in 架构 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 21 Jun 2026 22:41:52 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%9E%B6%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>MVC架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvc/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvc/</guid><description>&lt;h2 id="什么是mvc"&gt;什么是MVC&lt;/h2&gt;
&lt;p&gt;MVC（Model-View-Controller）是Apple官方推荐的iOS应用架构模式，也是最基础、最常见的架构。它将应用分为三个核心组件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model（模型）&lt;/strong&gt;：负责数据和业务逻辑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View（视图）&lt;/strong&gt;：负责界面展示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controller（控制器）&lt;/strong&gt;：负责协调Model和View&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mvc的结构apple-mvc"&gt;MVC的结构（Apple MVC）&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph TD
V[View&lt;br/&gt;UIView] --&gt;|用户事件| C[Controller&lt;br/&gt;UIViewController]
C --&gt;|更新UI| V
C &lt;--&gt;|读写数据| M[Model&lt;br/&gt;数据层]
&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;在Apple的MVC中，View和Model之间不能直接通信，所有交互都必须通过Controller中转。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="model模型层"&gt;Model（模型层）&lt;/h3&gt;
&lt;p&gt;Model负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据的存储和管理&lt;/li&gt;
&lt;li&gt;业务逻辑处理&lt;/li&gt;
&lt;li&gt;网络请求和数据持久化&lt;/li&gt;
&lt;li&gt;数据验证&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Model示例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; id: Int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; name: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; email: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; isValidEmail: Bool {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; emailRegex = &lt;span style="color:#e6db74"&gt;&amp;#34;[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.[A-Za-z]{2,64}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; emailPredicate = NSPredicate(format: &lt;span style="color:#e6db74"&gt;&amp;#34;SELF MATCHES %@&amp;#34;&lt;/span&gt;, emailRegex)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; emailPredicate.evaluate(with: email)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetchUser&lt;/span&gt;(id: Int, completion: @escaping (Result&amp;lt;User, Error&amp;gt;) -&amp;gt; Void) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 网络请求逻辑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="view视图层"&gt;View（视图层）&lt;/h3&gt;
&lt;p&gt;View负责：&lt;/p&gt;</description></item><item><title>MVI架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvi/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvi/</guid><description>&lt;h2 id="什么是mvi"&gt;什么是MVI&lt;/h2&gt;
&lt;p&gt;MVI（Model-View-Intent）是一种单向数据流架构模式。&amp;ldquo;Model-View-Intent&amp;quot;这一命名最早出现在Andre Medeiros（Staltz）创建的JavaScript框架Cycle.js中。2016年，Hannes Dorfmann在其博客系列中将MVI系统化引入Android开发，他在文中明确提到同时受到了Cycle.js和Redux（以及更早的Elm架构）的启发——MVI的命名和响应式理念来自Cycle.js，而Reducer纯函数和单一状态源的机制则与Redux一脉相承。随着Swift社区对函数式编程和响应式编程的接受度提高，MVI也逐渐被引入iOS开发。&lt;/p&gt;
&lt;p&gt;MVI的核心思想：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单向数据流&lt;/strong&gt;：数据沿固定方向流动（View -&amp;gt; Intent -&amp;gt; Reducer -&amp;gt; State -&amp;gt; View），没有捷径或后门&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不可变状态&lt;/strong&gt;：整个界面由单一不可变的State描述，每次更新都产生全新的State对象&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可预测性&lt;/strong&gt;：给定相同的当前State和Intent，Reducer总是产生相同的新State&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mvi的核心概念"&gt;MVI的核心概念&lt;/h2&gt;
&lt;h3 id="model状态"&gt;Model（状态）&lt;/h3&gt;
&lt;p&gt;在MVI中，Model不是传统意义上的领域数据模型，而是&lt;strong&gt;界面状态模型（State）&lt;/strong&gt;。它用一个不可变的值类型来描述UI在某一时刻的完整快照，包括数据内容、加载状态、错误信息等。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserListState&lt;/span&gt;: Equatable {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; users: [User]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; isLoading: Bool
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; error: String?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; searchQuery: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; initial = UserListState(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; users: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isLoading: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error: &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; searchQuery: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里使用&lt;code&gt;var&lt;/code&gt;属性配合&lt;code&gt;struct&lt;/code&gt;值类型，利用Swift的值语义在Reducer中通过拷贝实现不可变效果，这是Swift中最常用的做法（详见后文&amp;quot;状态的不可变性&amp;quot;一节）。&lt;/p&gt;
&lt;h3 id="intent意图"&gt;Intent（意图）&lt;/h3&gt;
&lt;p&gt;Intent代表所有触发状态变化的事件。它不仅包括用户的UI操作，还包括副作用的结果回调（如网络请求完成、数据库查询结果）、系统事件（如生命周期回调、推送通知）等。所有这些事件统一通过Intent进入Reducer驱动状态变化。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserListAction&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 用户意图&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; loadUsers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; refreshUsers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; deleteUser(id: Int)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; searchQueryChanged(String)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 副作用结果（也是Intent的一种）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; usersLoaded([User])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; loadFailed(String)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将用户操作和副作用结果统一为同一类型，是MVI的关键设计。这样Reducer就成为状态变化的唯一入口，所有状态转换都在一处完成。&lt;/p&gt;</description></item><item><title>MVP架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvp/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvp/</guid><description>&lt;h2 id="什么是mvp"&gt;什么是MVP&lt;/h2&gt;
&lt;p&gt;MVP（Model-View-Presenter）是一种&lt;strong&gt;将展示逻辑与视图分离&lt;/strong&gt;的架构模式，起源于上世纪90年代。MVP通过引入Presenter层来解决MVC中Controller职责过重（Massive ViewController）的问题。MVP的核心思想是让View变得&amp;quot;被动&amp;quot;（Passive View），所有的展示逻辑都由Presenter处理，View只负责UI的展示和事件的转发。&lt;/p&gt;
&lt;h2 id="mvp的结构"&gt;MVP的结构&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph LR
subgraph View["View (ViewController)"]
V1["- 只负责UI展示&lt;br/&gt;- 将事件转发给Presenter&lt;br/&gt;- 持有Presenter强引用"]
end
subgraph Presenter["Presenter"]
P1["- 持有View的弱引用（通过协议）&lt;br/&gt;- 持有Model的引用&lt;br/&gt;- 处理所有业务逻辑&lt;br/&gt;- 决定何时更新View"]
end
subgraph Model["Model"]
M1["数据和业务逻辑"]
end
View --&gt;|"用户事件"| Presenter
Presenter -.-&gt;|"weak引用&lt;br/&gt;调用协议方法更新UI"| View
Presenter &lt;--&gt;|"获取/更新数据"| Model
&lt;/pre&gt;
&lt;h2 id="mvp的三个组件"&gt;MVP的三个组件&lt;/h2&gt;
&lt;h3 id="model模型层"&gt;Model（模型层）&lt;/h3&gt;
&lt;p&gt;与MVC中的Model相同，负责数据和业务逻辑。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; id: Int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; name: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; email: String
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; avatarURL: URL?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;protocol&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserServiceProtocol&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetchUser&lt;/span&gt;(id: Int, completion: @escaping (Result&amp;lt;User, Error&amp;gt;) -&amp;gt; Void)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;updateUser&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; user: User, completion: @escaping (Result&amp;lt;Void, Error&amp;gt;) -&amp;gt; Void)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserService&lt;/span&gt;: UserServiceProtocol {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetchUser&lt;/span&gt;(id: Int, completion: @escaping (Result&amp;lt;User, Error&amp;gt;) -&amp;gt; Void) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 网络请求实现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;updateUser&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; user: User, completion: @escaping (Result&amp;lt;Void, Error&amp;gt;) -&amp;gt; Void) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 更新用户实现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="view视图层"&gt;View（视图层）&lt;/h3&gt;
&lt;p&gt;在MVP中，View是&amp;quot;被动的&amp;quot;（Passive View），它：&lt;/p&gt;</description></item><item><title>MVVM架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvvm/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvvm/</guid><description>&lt;h2 id="什么是mvvm"&gt;什么是MVVM&lt;/h2&gt;
&lt;p&gt;MVVM（Model-View-ViewModel）是一种通过数据绑定实现View和业务逻辑解耦的架构模式。它最初由Microsoft提出，用于WPF开发，后来被广泛应用于iOS开发。&lt;/p&gt;
&lt;p&gt;MVVM的核心特点是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ViewModel不持有View的引用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通过数据绑定实现View和ViewModel的同步&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View的状态完全由ViewModel驱动&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mvvm的结构"&gt;MVVM的结构&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph View["View (ViewController)"]
V1["绑定ViewModel的属性"]
V2["将用户事件传递给ViewModel"]
end
subgraph ViewModel["ViewModel"]
VM1["暴露可观察的属性"]
VM2["展示逻辑 + 业务逻辑"]
end
subgraph Model["Model"]
M1["数据模型"]
M2["数据访问 (API/DB)"]
end
View &lt;--&gt;|"数据绑定 (Binding)"| ViewModel
ViewModel --&gt;|"获取/更新数据"| Model
&lt;/pre&gt;
&lt;h2 id="mvvm的数据流"&gt;MVVM的数据流&lt;/h2&gt;
&lt;p&gt;MVVM的核心原则是：&lt;strong&gt;View不直接访问Model&lt;/strong&gt;，所有交互都通过ViewModel进行。在iOS开发中，由于&lt;code&gt;UIViewController&lt;/code&gt;的特殊地位，MVVM的数据流可以更细化为四个角色：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
subgraph View["View"]
V["纯UI展示&lt;br/&gt;用户交互触发"]
end
subgraph ViewController["ViewController"]
VC["数据绑定&lt;br/&gt;生命周期管理&lt;br/&gt;路由/导航"]
end
subgraph ViewModel["ViewModel"]
VM["业务逻辑&lt;br/&gt;数据转换&lt;br/&gt;状态管理"]
end
subgraph Model["Model"]
M["数据结构&lt;br/&gt;数据存储"]
end
VC --&gt;|"持有"| V
VC --&gt;|"持有"| VM
V --&gt;|"1. 用户交互"| VC
VC --&gt;|"2. 转发事件"| VM
VM --&gt;|"3. 业务处理"| M
M --&gt;|"4. 数据变化"| VM
VM --&gt;|"5. 状态更新"| VC
VC --&gt;|"6. 更新UI"| V
&lt;/pre&gt;
&lt;h3 id="各层职责与持有关系"&gt;各层职责与持有关系&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;职责&lt;/th&gt;
&lt;th&gt;持有关系&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;纯UI展示、触发用户交互事件&lt;/td&gt;
&lt;td&gt;不持有其他层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ViewController&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数据绑定、生命周期管理、持有View和ViewModel&lt;/td&gt;
&lt;td&gt;持有View和ViewModel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ViewModel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;业务逻辑、数据转换、状态管理&lt;/td&gt;
&lt;td&gt;持有Model/Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数据结构、数据存储&lt;/td&gt;
&lt;td&gt;不持有其他层&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="详细数据流说明"&gt;详细数据流说明&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;View → ViewController（用户交互）&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>TCA（The Composable Architecture）详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/tca/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/tca/</guid><description>&lt;h2 id="什么是tca"&gt;什么是TCA&lt;/h2&gt;
&lt;p&gt;TCA（The Composable Architecture）是由&lt;a href="https://www.pointfree.co"&gt;Point-Free&lt;/a&gt;团队开发的Swift架构框架，受&lt;a href="https://elm-lang.org"&gt;Elm&lt;/a&gt;和&lt;a href="https://redux.js.org/"&gt;Redux&lt;/a&gt;启发，为Apple平台提供了一套完整的应用构建工具，涵盖状态管理、副作用处理、模块化组合以及测试支持。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub仓库&lt;/strong&gt;：&lt;a href="https://github.com/pointfreeco/swift-composable-architecture"&gt;swift-composable-architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适用平台&lt;/strong&gt;：iOS、macOS、iPadOS、visionOS、tvOS、watchOS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适用UI框架&lt;/strong&gt;：SwiftUI、UIKit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TCA的核心理念是：将应用状态、变更动作、副作用和依赖显式化，构建可组合、可测试的&lt;strong&gt;单向数据流&lt;/strong&gt;架构。整体架构与Swift的语言特性（值语义、async/await、Observation、SwiftUI）紧密结合，强调小而纯的Reducer组合与明确的副作用管理。&lt;/p&gt;
&lt;h3 id="为什么需要tca"&gt;为什么需要TCA&lt;/h3&gt;
&lt;p&gt;在日常iOS开发中，TCA解决了以下核心问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;状态管理&lt;/strong&gt;：使用简单的值类型管理应用状态，支持在多个屏幕间共享状态，使一个屏幕的修改能立即反映到另一个屏幕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合性&lt;/strong&gt;：将大型功能拆分成可独立开发、独立测试的小组件，提取到独立模块后可轻松组合回完整功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;副作用处理&lt;/strong&gt;：以最可测试和可理解的方式让应用的某些部分与外部世界通信&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试能力&lt;/strong&gt;：不仅能测试单个功能，还能编写由多个部分组成的功能的集成测试，以及端到端测试来验证副作用如何影响应用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机工程学&lt;/strong&gt;：用尽可能少的概念和组成部分，通过简单的API实现以上所有目标&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tca的架构渊源"&gt;TCA的架构渊源&lt;/h3&gt;
&lt;p&gt;TCA的设计灵感主要来自Elm Architecture和Redux，同时与&lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/mvi/"&gt;MVI架构&lt;/a&gt;思想有诸多相似之处，但在Swift生态中进行了大量增强：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;Elm/Redux/MVI&lt;/th&gt;
&lt;th&gt;TCA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;核心思想&lt;/td&gt;
&lt;td&gt;Action -&amp;gt; State -&amp;gt; View 单向数据流&lt;/td&gt;
&lt;td&gt;同样的单向数据流，但深度融合Swift特性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;副作用处理&lt;/td&gt;
&lt;td&gt;自定义Middleware或自行实现&lt;/td&gt;
&lt;td&gt;内置Effect系统（基于async/await）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依赖注入&lt;/td&gt;
&lt;td&gt;需手动实现&lt;/td&gt;
&lt;td&gt;内置@Dependency系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;测试支持&lt;/td&gt;
&lt;td&gt;需自己构建&lt;/td&gt;
&lt;td&gt;提供TestStore，支持穷尽式断言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;组合能力&lt;/td&gt;
&lt;td&gt;基础支持&lt;/td&gt;
&lt;td&gt;Scope、forEach等丰富的Reducer组合手段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导航管理&lt;/td&gt;
&lt;td&gt;需自己实现&lt;/td&gt;
&lt;td&gt;内置状态化导航系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;状态共享&lt;/td&gt;
&lt;td&gt;需自己实现&lt;/td&gt;
&lt;td&gt;内置@Shared系统&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="tca的核心概念"&gt;TCA的核心概念&lt;/h2&gt;
&lt;p&gt;TCA包含以下核心概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Feature&lt;/strong&gt;：一个功能模块的整体单元，由&lt;code&gt;@Reducer&lt;/code&gt;标注，内含State、Action和Reducer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State&lt;/strong&gt;：描述功能所需的数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt;：功能中可能发生的所有事件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reducer&lt;/strong&gt;：接收State和Action，更新State并产生副作用（Effect）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Store&lt;/strong&gt;：持有State、驱动Reducer执行的运行时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope&lt;/strong&gt;：从父Store中切出子Store，实现Feature的模块化组合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect&lt;/strong&gt;：封装异步操作的副作用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency&lt;/strong&gt;：可替换的外部依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们之间的协作关系如下：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
View --&gt;|"send(Action)"| Store
Store --&gt;|"传递 State + Action"| Reducer
Reducer --&gt;|"更新后的 State"| Store
Reducer --&gt;|"返回 Effect"| Store
Store --&gt;|"State 变化驱动"| View
Store -.-&gt;|"scope"| ChildStore["子Store"]
&lt;/pre&gt;
&lt;h3 id="state状态"&gt;State（状态）&lt;/h3&gt;
&lt;p&gt;State是描述功能模块在某一时刻全部数据的值类型结构体：&lt;/p&gt;</description></item><item><title>VIPER架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/viper/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/viper/</guid><description>&lt;h2 id="什么是viper"&gt;什么是VIPER&lt;/h2&gt;
&lt;p&gt;VIPER是一种更加细粒度的架构模式，由Mutual Mobile公司提出。VIPER将应用分为五个层次：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;V&lt;/strong&gt;iew（视图）：负责UI展示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt;nteractor（交互器）：负责业务逻辑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;resenter（展示器）：负责视图逻辑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E&lt;/strong&gt;ntity（实体）：数据模型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt;outer（路由）：负责页面导航&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VIPER的核心思想是&lt;strong&gt;单一职责原则&lt;/strong&gt;，每个组件只负责一件事。&lt;/p&gt;
&lt;h2 id="viper的结构"&gt;VIPER的结构&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph Module["Module"]
View["View"]
Presenter["Presenter"]
Interactor["Interactor"]
Router["Router"]
Entity["Entity"]
View --&gt;|用户事件| Presenter
Presenter --&gt;|更新UI| View
Presenter --&gt;|业务请求| Interactor
Interactor --&gt;|业务结果| Presenter
Presenter --&gt;|导航请求| Router
Interactor --&gt;|读写数据| Entity
Router -.-&gt;|创建并导航到其他模块| View
end
&lt;/pre&gt;
&lt;h3 id="数据流向说明"&gt;数据流向说明&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;用户交互流&lt;/strong&gt;：View → Presenter → Interactor → Presenter → View&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导航流&lt;/strong&gt;：View → Presenter → Router → 新的 View&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据流&lt;/strong&gt;：Interactor → Entity（数据存储）→ Interactor → Presenter → View（数据展示）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="viper的五个组件"&gt;VIPER的五个组件&lt;/h2&gt;
&lt;h3 id="view视图层"&gt;View（视图层）&lt;/h3&gt;
&lt;p&gt;View负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;展示UI&lt;/li&gt;
&lt;li&gt;接收用户输入并传递给Presenter&lt;/li&gt;
&lt;li&gt;实现Presenter定义的协议&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// View协议&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;protocol&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserListViewProtocol&lt;/span&gt;: AnyObject {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showLoading&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showUsers&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; users: [UserViewModel])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showError&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; message: String)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ViewController实现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserListViewController&lt;/span&gt;: UIViewController, UserListViewProtocol {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; presenter: UserListPresenterProtocol!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; users: [UserViewModel] = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt;.viewDidLoad()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; presenter.viewDidLoad()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showUsers&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; users: [UserViewModel]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;self&lt;/span&gt;.users = users
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tableView.reloadData()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tableView&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; presenter.didSelectUser(at: indexPath.row)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="interactor交互器"&gt;Interactor（交互器）&lt;/h3&gt;
&lt;p&gt;Interactor负责：&lt;/p&gt;</description></item><item><title>iOS架构概述</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/ios%E6%9E%B6%E6%9E%84%E6%A6%82%E8%BF%B0/</link><pubDate>Sun, 21 Jun 2026 22:41:52 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/ios%E6%9E%B6%E6%9E%84%E6%A6%82%E8%BF%B0/</guid><description>&lt;h2 id="什么是架构"&gt;什么是架构&lt;/h2&gt;
&lt;p&gt;软件架构是指软件系统的高层结构，定义了系统的各个组成部分及其之间的关系。一个好的架构能够帮助我们：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责分离&lt;/strong&gt;：将不同的功能模块分开，降低耦合度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可测试性&lt;/strong&gt;：使代码更容易进行单元测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可维护性&lt;/strong&gt;：便于理解和修改代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展性&lt;/strong&gt;：方便添加新功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队协作&lt;/strong&gt;：不同开发者可以并行开发不同模块&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="架构的两个层次"&gt;架构的两个层次&lt;/h2&gt;
&lt;p&gt;在讨论iOS架构时，需要区分两种不同层次的架构：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;关注点&lt;/th&gt;
&lt;th&gt;代表模式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;页面架构&lt;/td&gt;
&lt;td&gt;单个页面内的代码组织&lt;/td&gt;
&lt;td&gt;MVC、MVP、MVVM、MVI、TCA、VIPER&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工程架构&lt;/td&gt;
&lt;td&gt;整个App的模块划分与通信&lt;/td&gt;
&lt;td&gt;组件化、插件化、微服务化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两者并不冲突，大型项目通常会同时采用：工程层面使用组件化拆分业务，每个组件内部使用MVVM等页面架构。&lt;/p&gt;
&lt;h2 id="页面架构模式"&gt;页面架构模式&lt;/h2&gt;
&lt;h3 id="mvc-model-view-controller"&gt;MVC (Model-View-Controller)&lt;/h3&gt;
&lt;p&gt;MVC是Apple官方推荐的架构模式，也是iOS开发中最基础的架构。&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
Controller &lt;--&gt;|读写| Model
Controller --&gt;|更新| View
View -.-&gt;|用户交互| Controller
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controller作为中介者连接Model和View&lt;/li&gt;
&lt;li&gt;View和Model不直接通信&lt;/li&gt;
&lt;li&gt;在iOS中，ViewController往往承担了过多职责&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mvp-model-view-presenter"&gt;MVP (Model-View-Presenter)&lt;/h3&gt;
&lt;p&gt;MVP是MVC的演进版本，将业务逻辑从Controller中抽离到Presenter。&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
Presenter --&gt;|更新| Model
Presenter --&gt;|更新| View
Model -.-&gt;|数据| Presenter
View -.-&gt;|事件| Presenter
View --- ViewController
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Presenter持有View的引用（通常是协议）&lt;/li&gt;
&lt;li&gt;View变得非常&amp;quot;被动&amp;quot;，只负责展示&lt;/li&gt;
&lt;li&gt;便于单元测试&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mvvm-model-view-viewmodel"&gt;MVVM (Model-View-ViewModel)&lt;/h3&gt;
&lt;p&gt;MVVM通过数据绑定实现View和ViewModel的同步更新。&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
ViewModel &lt;--&gt;|读写| Model
ViewModel &lt;--&gt;|数据绑定| View
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>微服务化架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%8C%96/</guid><description>&lt;h2 id="什么是客户端微服务化"&gt;什么是客户端微服务化&lt;/h2&gt;
&lt;p&gt;微服务化是将后端微服务的思想应用到客户端，将App内部按&lt;strong&gt;业务域&lt;/strong&gt;拆分为多个独立服务。每个服务拥有独立的数据存储和业务逻辑，服务间通过定义良好的接口通信。&lt;/p&gt;
&lt;p&gt;微服务化的核心关注点是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务域的逻辑划分&lt;/strong&gt;：按领域边界划分服务，而非按代码结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行时隔离&lt;/strong&gt;：服务在运行时保持独立，数据不互相污染&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务自治&lt;/strong&gt;：每个服务独立演进，对外提供稳定的契约&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="客户端微服务化-vs-后端微服务"&gt;客户端微服务化 vs 后端微服务&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;后端微服务&lt;/th&gt;
&lt;th&gt;客户端微服务化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;部署&lt;/td&gt;
&lt;td&gt;独立部署、独立运行的进程&lt;/td&gt;
&lt;td&gt;同一App内的独立服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通信&lt;/td&gt;
&lt;td&gt;HTTP/RPC/消息队列&lt;/td&gt;
&lt;td&gt;进程内通信（协议、事件总线）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据库&lt;/td&gt;
&lt;td&gt;每个服务独立数据库&lt;/td&gt;
&lt;td&gt;每个服务独立数据存储空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩缩容&lt;/td&gt;
&lt;td&gt;水平扩展多实例&lt;/td&gt;
&lt;td&gt;不适用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;故障隔离&lt;/td&gt;
&lt;td&gt;进程级隔离&lt;/td&gt;
&lt;td&gt;逻辑隔离（防御性编程）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心目标&lt;/td&gt;
&lt;td&gt;独立部署、水平扩展&lt;/td&gt;
&lt;td&gt;业务域划分、运行时隔离&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="微服务化与组件化的关系"&gt;微服务化与组件化的关系&lt;/h3&gt;
&lt;p&gt;微服务化和组件化是&lt;strong&gt;不同维度&lt;/strong&gt;的概念：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph 组件化视角["组件化视角 (物理结构)"]
C1["首页组件"]
C2["商城组件"]
C3["用户组件"]
C4["订单组件"]
end
subgraph 微服务化视角["微服务化视角 (逻辑划分)"]
S1["用户服务"]
S2["交易服务"]
S3["内容服务"]
end
C3 -.-&gt;|"实现"| S1
C4 -.-&gt;|"实现"| S2
C2 -.-&gt;|"实现"| S2
C1 -.-&gt;|"实现"| S3
&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;组件化&lt;/th&gt;
&lt;th&gt;微服务化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;关注点&lt;/td&gt;
&lt;td&gt;代码的物理隔离、编译解耦&lt;/td&gt;
&lt;td&gt;业务域的逻辑划分、运行时隔离&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;划分依据&lt;/td&gt;
&lt;td&gt;功能模块、代码边界&lt;/td&gt;
&lt;td&gt;业务领域、数据边界&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解决的问题&lt;/td&gt;
&lt;td&gt;编译依赖、团队协作、代码复用&lt;/td&gt;
&lt;td&gt;业务自治、数据隔离、服务演进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;粒度&lt;/td&gt;
&lt;td&gt;可大可小（页面、功能模块）&lt;/td&gt;
&lt;td&gt;通常较粗（业务域）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;实践中两者结合使用&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>插件化架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/%E6%8F%92%E4%BB%B6%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/%E6%8F%92%E4%BB%B6%E5%8C%96/</guid><description>&lt;h2 id="什么是插件化"&gt;什么是插件化&lt;/h2&gt;
&lt;p&gt;在iOS开发中，&lt;strong&gt;插件化&lt;/strong&gt;通常指的是&lt;strong&gt;编译期插件化&lt;/strong&gt;，即通过壳工程（Shell Project）按需装配不同的业务组件，生成不同功能的App。这与Android的运行时插件化（动态加载代码）有本质区别。&lt;/p&gt;
&lt;h3 id="ios插件化-vs-android插件化"&gt;iOS插件化 vs Android插件化&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;Android插件化&lt;/th&gt;
&lt;th&gt;iOS插件化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;实现方式&lt;/td&gt;
&lt;td&gt;运行时动态加载APK/DEX&lt;/td&gt;
&lt;td&gt;编译期按需集成组件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码热更新&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;td&gt;不支持（App Store限制）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主要目的&lt;/td&gt;
&lt;td&gt;绕过包大小限制、热修复&lt;/td&gt;
&lt;td&gt;多App复用、编译提效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技术难度&lt;/td&gt;
&lt;td&gt;高（Hook系统API）&lt;/td&gt;
&lt;td&gt;中（工程配置）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;iOS的&amp;quot;插件化&amp;quot;主要体现在：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;壳工程设计&lt;/strong&gt;：一套代码支撑多个App&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置驱动集成&lt;/strong&gt;：通过配置文件决定集成哪些组件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二进制化提效&lt;/strong&gt;：稳定组件编译为二进制，减少编译时间&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph 组件库["组件仓库"]
A[用户组件]
B[商城组件]
C[直播组件]
D[社区组件]
E[基础组件]
end
subgraph 壳工程["壳工程 (Shell Project)"]
Config["配置文件"]
Shell["壳工程代码"]
end
subgraph Apps["生成的App"]
App1["App A&lt;br/&gt;(用户+商城+基础)"]
App2["App B&lt;br/&gt;(用户+直播+基础)"]
App3["App C&lt;br/&gt;(全量组件)"]
end
A &amp; B &amp; C &amp; D &amp; E --&gt; Config
Config --&gt;|"按需装配"| App1
Config --&gt;|"按需装配"| App2
Config --&gt;|"按需装配"| App3
&lt;/pre&gt;
&lt;h2 id="两种插件化实现方式"&gt;两种插件化实现方式&lt;/h2&gt;
&lt;p&gt;根据组件间通信方案的不同，iOS插件化有两种主要实现方式，它们的核心区别在于&lt;strong&gt;是否强制要求编译期隔离&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>组件化架构详解</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/%E7%BB%84%E4%BB%B6%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-architecture/%E7%BB%84%E4%BB%B6%E5%8C%96/</guid><description>&lt;h2 id="什么是组件化"&gt;什么是组件化&lt;/h2&gt;
&lt;p&gt;组件化是一种&lt;strong&gt;工程架构思想&lt;/strong&gt;，将一个大型App拆分为多个独立的业务组件（Module），每个组件可以独立开发、独立测试、独立编译，组件之间通过&lt;strong&gt;中间层&lt;/strong&gt;进行解耦通信。&lt;/p&gt;
&lt;h3 id="组件化解决的问题"&gt;组件化解决的问题&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;未组件化&lt;/th&gt;
&lt;th&gt;组件化后&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;编译速度&lt;/td&gt;
&lt;td&gt;全量编译，耗时长&lt;/td&gt;
&lt;td&gt;只编译修改的组件，支持二进制化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;团队协作&lt;/td&gt;
&lt;td&gt;代码冲突频繁&lt;/td&gt;
&lt;td&gt;独立仓库，减少冲突&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码复用&lt;/td&gt;
&lt;td&gt;复制粘贴，难以维护&lt;/td&gt;
&lt;td&gt;组件复用，统一维护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;耦合度&lt;/td&gt;
&lt;td&gt;类之间直接依赖，牵一发动全身&lt;/td&gt;
&lt;td&gt;通过中间层通信，解耦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;测试&lt;/td&gt;
&lt;td&gt;难以单元测试&lt;/td&gt;
&lt;td&gt;组件可独立测试&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="组件化与页面架构的关系"&gt;组件化与页面架构的关系&lt;/h3&gt;
&lt;p&gt;组件化是&lt;strong&gt;工程架构&lt;/strong&gt;，关注的是App整体的模块划分和通信方式；而MVC、MVVM、TCA等是&lt;strong&gt;页面架构&lt;/strong&gt;，关注的是单个页面内的代码组织。&lt;/p&gt;
&lt;p&gt;两者并不冲突，在大型项目中通常会同时采用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工程层面&lt;/strong&gt;：使用组件化拆分业务模块&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件内部&lt;/strong&gt;：每个组件使用MVVM/TCA等页面架构&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph App["App壳工程"]
subgraph Module1["首页组件"]
M1V["View"]
M1VM["ViewModel"]
M1M["Model"]
end
subgraph Module2["商城组件"]
M2V["View"]
M2VM["ViewModel"]
M2M["Model"]
end
Router["路由/中间件"]
end
Module1 &lt;--&gt; Router
Module2 &lt;--&gt; Router
&lt;/pre&gt;
&lt;h2 id="组件化的分层架构"&gt;组件化的分层架构&lt;/h2&gt;
&lt;p&gt;典型的组件化架构采用三层结构：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph 业务层["业务层 - Business Layer"]
A[首页组件]
B[商城组件]
C[用户组件]
D[消息组件]
end
subgraph 中间层["中间层 - Mediator Layer"]
E[路由Router]
F[服务Service]
end
subgraph 基础层["基础层 - Foundation Layer"]
G[网络库]
H[图片库]
I[数据库]
J[工具库]
end
A &amp; B &amp; C &amp; D --&gt; E &amp; F
E &amp; F --&gt; G &amp; H &amp; I &amp; J
&lt;/pre&gt;
&lt;h3 id="业务层business-layer"&gt;业务层（Business Layer）&lt;/h3&gt;
&lt;p&gt;业务层包含各个业务组件，每个组件是一个独立的业务单元：&lt;/p&gt;</description></item><item><title>架构</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/css/css-022/</link><pubDate>Thu, 10 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/css/css-022/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;在项目中经常存在如下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.模块拆分不合理&lt;/li&gt;
&lt;li&gt;2.变量和函数命名不知所云&lt;/li&gt;
&lt;li&gt;3.缺少注释或者是写了一堆描述不清的内容&lt;/li&gt;
&lt;li&gt;4.重复的代码遍布各个角落等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为这些不良的编程习惯，导致了项目越来越难以维护，程序性能越来越低，大大降低了日常的工作效率以及提高了公司的开发成本。&lt;/p&gt;
&lt;p&gt;下面就以CSS在Vue3项目中的架构为切入点，通过减少CSS代码的冗余度和增强CSS代码的维护性、扩展性来提高我们的编程能力和项目架构能力。&lt;/p&gt;
&lt;h2 id="css的设计模式"&gt;CSS的设计模式&lt;/h2&gt;
&lt;p&gt;在学习CSS架构之前，我们先简单看一下常见的5种CSS设计模式，这些设计模式都为我们的CSS架构提供了一定的开发思路。&lt;/p&gt;
&lt;h3 id="1oocss模式"&gt;1.OOCSS模式&lt;/h3&gt;
&lt;p&gt;OOCSS(Object-Oriented CSS)字面意思是面向对象的CSS，在开发中它有如下的规范约定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;减少对 HTML 结构的依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# bad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1.匹配效率低，影响css性能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2.和html耦合度高，维护性和扩展性低&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.container-list ul li a &lt;span style="color:#f92672"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;div class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container-list&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;a&amp;gt;...&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# good&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.container-list .list-item &lt;span style="color:#f92672"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;div class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container-list&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;a class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;list-item&amp;#34;&lt;/span&gt;&amp;gt;...&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;增加样式的复用性&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.label &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 公共代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.label-danger &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 特定代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.label-info &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 特定代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;p class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;label label-danger&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;p class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;label label-info&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2bem模式"&gt;2.BEM模式&lt;/h3&gt;
&lt;p&gt;BEM 是进阶版的OOCSS，是一个分层系统，它把我们的网站分为三层，这三层正好对应着 BEM 三个英文单词的简写 block, element, modifier，分为为 块层、元素层、修饰符层。&lt;/p&gt;</description></item></channel></rss>