界面背后,系统如何运转。
关于 iOS、系统设计和产品实践的技术笔记,也收录了早期的学习记录。把难题拆开,把取舍讲清楚。
关键帧:让曲线编辑、预览与导出逐帧一致
亲手调整贝塞尔曲线,逐帧观察动画数值,再理解时钟、采样、切割与版本化数据如何共同保证关键帧一致性。
滤镜是一张查找表
从滤镜下载走进逐帧渲染:理解视频管线、帧缓冲、3D LUT,以及为什么草稿应保存特效标识符而不是文件路径。
草稿不是一个文件,而是一张标识符关系图
用检查点、内容寻址素材和版本化文档设计云草稿,让崩溃恢复、跨设备续编、冲突与配额都有明确语义。
一份代码、两个地区:五层隔离的设计
从 Workspace、依赖与 Subspec,到能力注入、配置和单个协议方法,为不同形状的地区差异选择合适的边界。
跨团队协作,也像跨进程通信
从两个 App 的同步发布 SDK 出发,比较传文件与传标识符,理解小协议、共享事实来源、版本协商和异步回调的价值。
WWDC 2019 一年后:把 Property Wrapper 用到生产里
用一个类型安全的属性包装器集中地区品牌差异,让业务代码不再反复判断当前 Target,同时明确数值、行为与模块边界。
为协同 Web 编辑器设计原生桥接协议
在 iOS SDK、WebKit 编辑器与实时协同引擎之间,建立类型明确、异步可控、能够恢复的协议边界。
文档 SDK 为什么选择 Swinject
把依赖组装留在系统边界,让 Host、账号和文档会话分别拥有自己的生命周期,离线与测试也成为可明确组合的运行环境。
为什么我们从 IGListKit 回到 UICollectionView
iOS 13 的 Diffable Data Source 与 Compositional Layout 改变了抽象边界:如何保留列表模块化,同时减少不再需要的适配层。
用 ReSwift 收拢复杂文档列表的数据流
让筛选、元数据更新、缓存与网络共享一份权威状态,通过 Action、Reducer 和 Middleware 拒绝过期结果,明确状态归属。
一个页面、两个 Table View、三种加载任务
从 Banner 与内容列表的滚动交接出发,明确手势归属、惯性交接和刷新、运营位、分页之间的优先级。
用 Swift OptionSet 建模可组合的文档权限
将读取、编辑和链接分享拆成能力集合,再统一处理文件夹继承、显式限制与账号策略,避免角色组合不断膨胀。
实现一个 LRU 缓存
用双向链表维护访问顺序,用哈希表定位节点,理解 LRU 淘汰策略及其 C++ 实现。
沿着一次 GET 请求读懂 AFNetworking 3.x
以 AFNetworking 3.2.1 为例,追踪请求序列化、Task 与代理的协作,并区分回调队列、连接数与业务并发限制。
Objective-C 的 Category 与 Class Extension
Category 在运行时扩展行为,Class Extension 参与类本身的编译。理解两者的生命周期、存储能力和使用边界。
从零实现 UITableView 的 Cell 复用
从一千行数据和一个小小的可视窗口出发,用 Swift 重建复用池,理解异步图片错位与状态残留的根源。
理解 Objective-C Runtime:从消息发送到消息转发
从 isa、类与元类出发,串起 SEL、IMP、方法缓存和消息转发,理解 Objective-C 语法背后的运行机制。