<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>总结 on 土土哥的技术 Blog</title><link>https://tutuge.me/tags/%E6%80%BB%E7%BB%93/</link><description>Recent content in 总结 on 土土哥的技术 Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>tutuge</copyright><lastBuildDate>Fri, 10 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tutuge.me/tags/%E6%80%BB%E7%BB%93/index.xml" rel="self" type="application/rss+xml"/><item><title>九年之后，重新整理一下过去写过的文章</title><link>https://tutuge.me/2026/07/11/myblog-posts-index/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://tutuge.me/2026/07/11/myblog-posts-index/</guid><description>&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;距离上一次写博客已经过去 9 年了。回头看了一下最后几篇文章的时间，确实有点恍惚，时光荏苒这句话放在这里还挺合适。&lt;/p&gt;
&lt;p&gt;这几年技术变化很快，尤其随着 AI 时代的来临，查资料、整理脉络、校对文字、补齐上下文的成本都低了不少。以前写一篇文章，很多精力会花在资料整理和表达打磨上；现在这些环节可以被工具分担一部分，反而更应该把项目里的问题、判断和思考沉淀下来。&lt;/p&gt;
&lt;p&gt;所以接下来还是想把博客重新写起来，并且尽量不间断地继续更新。在继续写新的内容之前，先把过去几年写过的文章做一次总结和索引，也算是给这个博客重新接上线。&lt;/p&gt;
&lt;p&gt;之前写文章的时候基本都是遇到一个问题、做了一个控件、踩了一个坑，然后顺手整理出来。时间长了以后，单篇文章之间其实是有脉络的：有些是 iOS 工程结构，有些是 Runtime 和内存管理，有些是 UI 交互和开源控件，还有一些是读书笔记、翻译和服务端相关的小实践。本文就把它们按主题重新整理一下，方便以后自己回头查，也方便刚好搜到某一篇的同学顺着同一类问题继续看下去。&lt;/p&gt;
&lt;h2 id="整体回顾"&gt;&lt;a href="#%e6%95%b4%e4%bd%93%e5%9b%9e%e9%a1%be" class="header-anchor"&gt;&lt;/a&gt;整体回顾
&lt;/h2&gt;&lt;p&gt;目前博客里的旧文章主要集中在 2014 到 2017 年，一共 42 篇。现在回头看，这些文章当然带着很明显的时间痕迹：Objective-C、Masonry、CocoaPods、早期 Swift、Runtime、反编译，这些都是当时做 iOS 开发绕不开的话题。&lt;/p&gt;
&lt;p&gt;不过很多问题并没有过时，只是换了技术栈和工具形态。比如代码怎么拆、接口怎么设计、复杂页面怎么优化、遇到奇怪问题怎么验证，这些到现在依然是工程里每天都会遇到的事情。&lt;/p&gt;
&lt;p&gt;大致按年份看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2014 年&lt;/strong&gt;，主要是刚开始写 Blog，以及一个 Android 开源控件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2015 年&lt;/strong&gt;，文章最多，覆盖了 iOS 项目结构、Objective-C 基础、UITableView 性能、GCD、Auto Layout、Runtime、Swift 控件等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2016 年&lt;/strong&gt;，更多是在总结工程化、模块化、代码组织、API 设计，也有一些更底层的内存管理和消息发送内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2017 年&lt;/strong&gt;，主要集中在 Runtime、反编译、Xcode Bug 分析，以及几个控件和工具库。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果按阅读路线来分，则可以这样看：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;想看 iOS 工程实践，可以先看项目结构、模块化、代码组织。&lt;/li&gt;
&lt;li&gt;想看 Objective-C 底层，可以从 &lt;code&gt;@autoreleasepool&lt;/code&gt;、&lt;code&gt;__autoreleasing&lt;/code&gt;、&lt;code&gt;objc_msgSend&lt;/code&gt;、&lt;code&gt;methodSignatureForSelector:&lt;/code&gt; 这几篇开始。&lt;/li&gt;
&lt;li&gt;想看 UI 实现，可以看 Auto Layout 系列、UITextView 图文混排、几个 TTG 开源控件。&lt;/li&gt;
&lt;li&gt;想查具体问题，就直接按下面的主题索引找。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="工程结构架构与协作"&gt;&lt;a href="#%e5%b7%a5%e7%a8%8b%e7%bb%93%e6%9e%84%e6%9e%b6%e6%9e%84%e4%b8%8e%e5%8d%8f%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;工程结构、架构与协作
&lt;/h2&gt;&lt;p&gt;这一类文章主要讨论“代码应该怎么放、怎么拆、怎么协作”。很多观点放到现在不一定是唯一答案，但是问题本身一直存在：项目变大以后，如何让代码还能被理解、修改和复用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/01/iOS%e9%a1%b9%e7%9b%ae%e7%9a%84%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84-%e5%8e%9f%e5%88%9b/" &gt;iOS项目的目录结构-原创&lt;/a&gt;&lt;br&gt;
比较早的一篇工程结构整理，重点是从目录层面把业务、工具、资源、第三方代码分清楚。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/01/Entity%e5%92%8cModel%e7%9a%84%e4%b8%8d%e5%90%8c-%e5%85%b3%e4%ba%8e%e4%bb%a3%e7%a0%81%e7%9a%84%e6%95%b0%e6%8d%ae%e5%b1%82/" &gt;Entity和Model的不同-关于代码的数据层&lt;/a&gt;&lt;br&gt;
讨论数据层对象的职责边界，适合和后面的 ViewModel、数据加工、接口返回设计一起看。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/16/%e5%88%a9%e7%94%a8NSProxy%e5%ae%9e%e7%8e%b0%e6%b6%88%e6%81%af%e8%bd%ac%e5%8f%91-%e6%a8%a1%e5%9d%97%e5%8c%96%e7%9a%84%e7%bd%91%e7%bb%9c%e6%8e%a5%e5%8f%a3%e5%b1%82%e8%ae%be%e8%ae%a1-%e5%8e%9f%e5%88%9b/" &gt;利用NSProxy实现消息转发-模块化的网络接口层设计-原创&lt;/a&gt;&lt;br&gt;
从 &lt;code&gt;NSProxy&lt;/code&gt; 和消息转发切入，把网络接口层做成更清晰的调用入口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/03/29/modular-and-component-summary/" &gt;对组件化与模块化的思考与总结&lt;/a&gt;&lt;br&gt;
当时读了不少组件化文章后做的一次整理，重点是“模块”和“组件”的区别，以及如何从业务、技术、界面、数据几条线去拆分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/04/10/summary-of-code-organization/" &gt;总结一些iOS项目中组织代码的方法&lt;/a&gt;&lt;br&gt;
从 CocoaPods 私有库、Carthage、Xcode Group、Category、&lt;code&gt;#pragma mark&lt;/code&gt; 等不同粒度整理代码组织方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/05/02/design-json-api-respoense/" &gt;API返回结果设计经验与总结&lt;/a&gt;&lt;br&gt;
虽然分类放在服务端，但本质也是客户端和服务端协作的接口契约问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/28/%e4%b8%80%e6%ac%a1%e5%ae%a1%e6%a0%b8%e8%a2%ab%e6%8b%92%e7%9a%84%e7%bb%8f%e5%8e%86-%e5%85%b3%e4%ba%8eiCloud%e5%88%b0%e5%ba%95%e5%ba%94%e8%af%a5%e5%a4%87%e4%bb%bd%e4%bb%80%e4%b9%88%e6%95%b0%e6%8d%ae/" &gt;一次审核被拒的经历-关于iCloud到底应该备份什么数据&lt;/a&gt;&lt;br&gt;
一个偏实践的审核问题，记录了 iCloud 备份数据边界，属于踩坑型文章。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="objective-cruntime-与内存管理"&gt;&lt;a href="#objective-cruntime-%e4%b8%8e%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;Objective-C、Runtime 与内存管理
&lt;/h2&gt;&lt;p&gt;这一组文章是我自己回头看时比较有连续性的部分：一开始是内存和属性行为，后面慢慢过渡到 Runtime、消息转发、反编译和系统实现。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/18/NSString%e7%9a%84Copy%e4%b8%8e%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d/" &gt;NSString的Copy与内存分配&lt;/a&gt;&lt;br&gt;
从 &lt;code&gt;NSString&lt;/code&gt;、&lt;code&gt;NSMutableString&lt;/code&gt; 的 &lt;code&gt;copy&lt;/code&gt; 行为入手，看对象拷贝和内存分配。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/17/what-is-autoreleasepool/" &gt;@autoreleasepool-内存的分配与释放&lt;/a&gt;&lt;br&gt;
整理 &lt;code&gt;@autoreleasepool&lt;/code&gt; 的基本行为，是后面看 &lt;code&gt;__autoreleasing&lt;/code&gt; 的基础。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/04/30/autoreleasing-meet-autoreleasepool/" &gt;结合访问Out Parameters出现EXC_BAD_ACCESS的例子，反编译汇编解读__autoreleasing&lt;/a&gt;&lt;br&gt;
通过 Out Parameters 的 crash 例子，继续看 &lt;code&gt;__autoreleasing&lt;/code&gt; 和 autorelease pool 的关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/06/19/translation-why-objcmsgsend-must-be-written-in-assembly/" &gt;翻译-为什么objc_msgSend必须用汇编实现&lt;/a&gt;&lt;br&gt;
一篇翻译文章，但对理解 Objective-C 消息发送、寄存器、调用约定很有帮助。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/07/08/fill-nil-property-of-object/" &gt;用Runtime的手段填充任意NSObject对象的nil属性&lt;/a&gt;&lt;br&gt;
一个用 Runtime 遍历属性并填充默认值的小实践，适合理解属性列表和动态处理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/07/25/compatibility-with-macro-category-and-runtime/" &gt;解决iOS项目的版本兼容问题-结合宏、Category和Runtime&lt;/a&gt;&lt;br&gt;
用宏、Category、Runtime 做版本兼容处理，属于工程实践和 Runtime 的交叉。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2017/03/11/TTGDeallocTaskHelper/" &gt;在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper&lt;/a&gt;&lt;br&gt;
围绕对象销毁阶段执行任务，涉及生命周期、关联对象和封装方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2017/03/14/xcode8-crash-on-out-parameter/" &gt;反编译分析Xcode8的Bug, release下连续两次调用有二级指针参数的空方法会Crash&lt;/a&gt;&lt;br&gt;
一个比较典型的“写 Demo 验证 -&amp;gt; 反编译分析 -&amp;gt; 总结原因”的问题排查过程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2017/04/08/diy-methodSignatureForSelector/" &gt;反编译分析并模拟实现methodSignatureForSelector方法&lt;/a&gt;&lt;br&gt;
从 &lt;code&gt;methodSignatureForSelector:&lt;/code&gt; 的行为差异出发，最后尝试模拟实现，适合作为 Runtime 深入阅读的一篇。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="并发性能与小技巧"&gt;&lt;a href="#%e5%b9%b6%e5%8f%91%e6%80%a7%e8%83%bd%e4%b8%8e%e5%b0%8f%e6%8a%80%e5%b7%a7" class="header-anchor"&gt;&lt;/a&gt;并发、性能与小技巧
&lt;/h2&gt;&lt;p&gt;这一类文章更偏“项目里马上能用到”的经验。现在很多技术栈已经变化了，但里面的一些判断方式仍然有参考意义，比如提前计算、缓存、减少重复创建、明确线程上下文等。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/19/%e6%8f%90%e5%8d%87UITableView%e6%80%a7%e8%83%bd-%e5%a4%8d%e6%9d%82%e9%a1%b5%e9%9d%a2%e7%9a%84%e4%bc%98%e5%8c%96/" &gt;提升UITableView性能-复杂页面的优化&lt;/a&gt;&lt;br&gt;
从复杂动态页面入手，总结 Cell 复用、高度缓存、数据预处理、View 缓存等优化点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/04/03/something-about-gcd/" &gt;GCD使用经验与技巧浅谈&lt;/a&gt;&lt;br&gt;
对 GCD 常见使用方式做了一次整理，包括队列、同步异步、延迟执行等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/29/bind-data-to-gcd-queue/" &gt;为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权&lt;/a&gt;&lt;br&gt;
一个更细的问题：如何给 GCD 队列绑定 Objective-C 对象，并正确处理内存管理权。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/19/Block%e7%b1%bb%e5%9e%8b%e5%8f%98%e9%87%8f-%e7%bc%93%e5%ad%98Http%e8%af%b7%e6%b1%82%e4%b8%8e%e5%9b%9e%e8%b0%83/" &gt;Block类型变量-缓存Http请求与回调&lt;/a&gt;&lt;br&gt;
通过 Block 保存回调，解决重复请求和回调分发问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/15/%e6%9c%89%e5%85%b3%e5%ae%8f%e5%ae%9a%e4%b9%89%e7%9a%84%e7%bb%8f%e9%aa%8c%e4%b8%8e%e6%8a%80%e5%b7%a7-%e7%ae%80%e5%8c%96%e4%bb%a3%e7%a0%81-%e5%a2%9e%e5%bc%baLog/" &gt;有关宏定义的经验与技巧-简化代码-增强Log&lt;/a&gt;&lt;br&gt;
记录了一些宏定义用法，重点是让重复代码更少、调试信息更清楚。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ui布局与交互实现"&gt;&lt;a href="#ui%e5%b8%83%e5%b1%80%e4%b8%8e%e4%ba%a4%e4%ba%92%e5%ae%9e%e7%8e%b0" class="header-anchor"&gt;&lt;/a&gt;UI、布局与交互实现
&lt;/h2&gt;&lt;p&gt;这一组基本都是“先有一个效果，再拆解实现”的文章。相比纯理论，我自己更喜欢这种写法：先把画面、交互、约束关系摆出来，再一点点推到代码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/07/UITextView%e7%bc%96%e8%be%91%e6%97%b6%e6%8f%92%e5%85%a5%e8%87%aa%e5%ae%9a%e4%b9%89%e8%a1%a8%e6%83%85-%e7%ae%80%e5%8d%95%e7%9a%84%e5%9b%be%e6%96%87%e6%b7%b7%e7%bc%96/" &gt;UITextView编辑时插入自定义表情-简单的图文混编&lt;/a&gt;&lt;br&gt;
记录 &lt;code&gt;UITextView&lt;/code&gt; 中插入自定义表情的基础实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/04/21/resizable-nstextattachment/" &gt;UITextView编辑时插入自定义表情-续-自定义表情图片的大小&lt;/a&gt;&lt;br&gt;
继续处理 &lt;code&gt;NSTextAttachment&lt;/code&gt; 图片大小的问题，是上一篇的补充。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/05/23/autolayout-example-with-masonry/" &gt;有趣的Autolayout示例-Masonry实现&lt;/a&gt;&lt;br&gt;
Auto Layout + Masonry 系列第一篇，用有趣的布局示例解释约束。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/08/08/autolayout-example-with-masonry2/" &gt;有趣的Autolayout示例2-Masonry实现&lt;/a&gt;&lt;br&gt;
Auto Layout 系列第二篇，继续通过示例练习约束关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/12/14/autolayout-example-with-masonry3/" &gt;有趣的Autolayout示例3-Masonry实现&lt;/a&gt;&lt;br&gt;
Auto Layout 系列第三篇。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/08/06/autolayout-example-with-masonry4/" &gt;有趣的Autolayout示例4-Masonry实现&lt;/a&gt;&lt;br&gt;
Auto Layout 系列第四篇。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2017/03/12/autolayout-example-with-masonry5/" &gt;有趣的Autolayout示例5-Masonry实现&lt;/a&gt;&lt;br&gt;
Auto Layout 系列第五篇，也是这个系列后面的一次补充。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2017/03/08/quartzcode-demo-star-animation/" &gt;用QuartzCode快速实现一个收藏动画&lt;/a&gt;&lt;br&gt;
通过 QuartzCode 快速做收藏动画，重点是工具生成动画代码后的理解和使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="开源项目与控件实现"&gt;&lt;a href="#%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e4%b8%8e%e6%8e%a7%e4%bb%b6%e5%ae%9e%e7%8e%b0" class="header-anchor"&gt;&lt;/a&gt;开源项目与控件实现
&lt;/h2&gt;&lt;p&gt;这些文章基本都围绕一个具体控件或工具展开：为什么做、最终效果是什么、API 怎么设计、关键实现点在哪里。现在看起来，有些库可能已经偏老了，不过当时做开源项目时对封装、文档、Demo 的训练还是很有价值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2014/11/02/LinkTextView-Android%e5%bc%80%e6%ba%90%e5%ba%93-%e5%8e%9f%e5%88%9b/" &gt;Android开源库-LinkTextView-原创&lt;/a&gt;&lt;br&gt;
早期的 Android 开源控件，用来处理文本中的链接点击。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/10/09/ttgsnackbar-lib/" &gt;Swift写的库-TTGSnackbar&lt;/a&gt;&lt;br&gt;
一个 Swift 写的 Snackbar 控件，重点在交互展示和 API 封装。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/10/25/ttgemojirate-lib/" &gt;Swift开源项目: TTGEmojiRate的实现&lt;/a&gt;&lt;br&gt;
基于 &lt;code&gt;UIBezierPath&lt;/code&gt;、手势和绘制实现 Emoji 评分控件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/12/31/TTGTagCollectionView/" &gt;开源项目-TTGTagCollectionView&lt;/a&gt;&lt;br&gt;
标签布局控件，适合看布局计算、数据源和代理 API 的设计。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/08/28/TTGBingWallPaper/" &gt;Swift开源Mac App - BingWallPaper&lt;/a&gt;&lt;br&gt;
一个 macOS 菜单栏应用，用 Swift 获取 Bing 壁纸并设置桌面背景。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/12/25/TTGPuzzleVerify/" &gt;开源项目-拼图验证控件TTGPuzzleVerify的实现&lt;/a&gt;&lt;br&gt;
拼图验证控件，包含图片裁剪、遮罩、滑动验证等实现点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2017/03/11/TTGDeallocTaskHelper/" &gt;在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper&lt;/a&gt;&lt;br&gt;
既是开源库，也可以归到 Runtime 和对象生命周期相关内容里。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="读书笔记与翻译"&gt;&lt;a href="#%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0%e4%b8%8e%e7%bf%bb%e8%af%91" class="header-anchor"&gt;&lt;/a&gt;读书笔记与翻译
&lt;/h2&gt;&lt;p&gt;这部分主要是阅读《Effective Objective-C》和技术文章后的整理。它们不算完整翻译，更像是把书里的点和自己的理解合在一起做记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/05/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-1/" &gt;Effective-Objective-C-读书笔记-Item-1&lt;/a&gt;&lt;br&gt;
Effective Objective-C 系列笔记开头。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/06/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-2/" &gt;Effective-Objective-C-读书笔记-Item-2&lt;/a&gt;&lt;br&gt;
继续整理 Objective-C 基础概念。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/02/14/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-3/" &gt;Effective-Objective-C-读书笔记-Item-3&lt;/a&gt;&lt;br&gt;
读书笔记第三篇。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/11/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-4-%e5%a6%82%e4%bd%95%e6%ad%a3%e7%a1%ae%e5%ae%9a%e4%b9%89%e5%b8%b8%e9%87%8f/" &gt;Effective-Objective-C-读书笔记-Item-4-如何正确定义常量&lt;/a&gt;&lt;br&gt;
重点是常量定义方式，也是实际项目里很常见的问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/03/21/effective-objective-c-5-enum/" &gt;Enum-枚举的正确使用-Effective-Objective-C-读书笔记-Item-5&lt;/a&gt;&lt;br&gt;
整理枚举的正确使用方式，包括位掩码等内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/06/19/translation-why-objcmsgsend-must-be-written-in-assembly/" &gt;翻译-为什么objc_msgSend必须用汇编实现&lt;/a&gt;&lt;br&gt;
这篇同时也属于 Runtime 主题，放在这里是因为它本身是翻译文章。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="服务端跨端与其它"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e7%ab%af%e8%b7%a8%e7%ab%af%e4%b8%8e%e5%85%b6%e5%ae%83" class="header-anchor"&gt;&lt;/a&gt;服务端、跨端与其它
&lt;/h2&gt;&lt;p&gt;虽然博客大部分是 iOS，但也有几篇不是纯 iOS 的内容。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2015/04/19/thrift-example-cpp-and-php/" &gt;RPC框架Thrift例子-PHP调用C++后端程序&lt;/a&gt;&lt;br&gt;
用一个小例子记录 Thrift、PHP、C++ 后端之间的调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2016/05/02/design-json-api-respoense/" &gt;API返回结果设计经验与总结&lt;/a&gt;&lt;br&gt;
从接口返回结构出发，讨论 &lt;code&gt;code&lt;/code&gt;、&lt;code&gt;message&lt;/code&gt;、&lt;code&gt;data&lt;/code&gt; 等字段的设计。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2014/11/02/LinkTextView-Android%e5%bc%80%e6%ba%90%e5%ba%93-%e5%8e%9f%e5%88%9b/" &gt;Android开源库-LinkTextView-原创&lt;/a&gt;&lt;br&gt;
Android 控件文章，也算是早期跨端尝试的一部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tutuge.me/2014/11/01/%e7%ac%ac%e4%b8%80%e7%af%87Blog/" &gt;第一篇Blog&lt;/a&gt;&lt;br&gt;
真正意义上的第一篇，更多是一个开始的记录。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="按年份索引"&gt;&lt;a href="#%e6%8c%89%e5%b9%b4%e4%bb%bd%e7%b4%a2%e5%bc%95" class="header-anchor"&gt;&lt;/a&gt;按年份索引
&lt;/h2&gt;&lt;p&gt;如果不按主题，而是按时间看，脉络会更明显一些。&lt;/p&gt;
&lt;h3 id="2014"&gt;&lt;a href="#2014" class="header-anchor"&gt;&lt;/a&gt;2014
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2014/11/01/%e7%ac%ac%e4%b8%80%e7%af%87Blog/" &gt;第一篇Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2014/11/02/LinkTextView-Android%e5%bc%80%e6%ba%90%e5%ba%93-%e5%8e%9f%e5%88%9b/" &gt;Android开源库-LinkTextView-原创&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2015"&gt;&lt;a href="#2015" class="header-anchor"&gt;&lt;/a&gt;2015
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/01/iOS%e9%a1%b9%e7%9b%ae%e7%9a%84%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84-%e5%8e%9f%e5%88%9b/" &gt;iOS项目的目录结构-原创&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/05/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-1/" &gt;Effective-Objective-C-读书笔记-Item-1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/06/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-2/" &gt;Effective-Objective-C-读书笔记-Item-2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/14/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-3/" &gt;Effective-Objective-C-读书笔记-Item-3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/16/%e5%88%a9%e7%94%a8NSProxy%e5%ae%9e%e7%8e%b0%e6%b6%88%e6%81%af%e8%bd%ac%e5%8f%91-%e6%a8%a1%e5%9d%97%e5%8c%96%e7%9a%84%e7%bd%91%e7%bb%9c%e6%8e%a5%e5%8f%a3%e5%b1%82%e8%ae%be%e8%ae%a1-%e5%8e%9f%e5%88%9b/" &gt;利用NSProxy实现消息转发-模块化的网络接口层设计-原创&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/18/NSString%e7%9a%84Copy%e4%b8%8e%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d/" &gt;NSString的Copy与内存分配&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/19/%e6%8f%90%e5%8d%87UITableView%e6%80%a7%e8%83%bd-%e5%a4%8d%e6%9d%82%e9%a1%b5%e9%9d%a2%e7%9a%84%e4%bc%98%e5%8c%96/" &gt;提升UITableView性能-复杂页面的优化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/19/Block%e7%b1%bb%e5%9e%8b%e5%8f%98%e9%87%8f-%e7%bc%93%e5%ad%98Http%e8%af%b7%e6%b1%82%e4%b8%8e%e5%9b%9e%e8%b0%83/" &gt;Block类型变量-缓存Http请求与回调&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/02/28/%e4%b8%80%e6%ac%a1%e5%ae%a1%e6%a0%b8%e8%a2%ab%e6%8b%92%e7%9a%84%e7%bb%8f%e5%8e%86-%e5%85%b3%e4%ba%8eiCloud%e5%88%b0%e5%ba%95%e5%ba%94%e8%af%a5%e5%a4%87%e4%bb%bd%e4%bb%80%e4%b9%88%e6%95%b0%e6%8d%ae/" &gt;一次审核被拒的经历-关于iCloud到底应该备份什么数据&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/01/Entity%e5%92%8cModel%e7%9a%84%e4%b8%8d%e5%90%8c-%e5%85%b3%e4%ba%8e%e4%bb%a3%e7%a0%81%e7%9a%84%e6%95%b0%e6%8d%ae%e5%b1%82/" &gt;Entity和Model的不同-关于代码的数据层&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/07/UITextView%e7%bc%96%e8%be%91%e6%97%b6%e6%8f%92%e5%85%a5%e8%87%aa%e5%ae%9a%e4%b9%89%e8%a1%a8%e6%83%85-%e7%ae%80%e5%8d%95%e7%9a%84%e5%9b%be%e6%96%87%e6%b7%b7%e7%bc%96/" &gt;UITextView编辑时插入自定义表情-简单的图文混编&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/11/Effective-Objective-C-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-Item-4-%e5%a6%82%e4%bd%95%e6%ad%a3%e7%a1%ae%e5%ae%9a%e4%b9%89%e5%b8%b8%e9%87%8f/" &gt;Effective-Objective-C-读书笔记-Item-4-如何正确定义常量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/15/%e6%9c%89%e5%85%b3%e5%ae%8f%e5%ae%9a%e4%b9%89%e7%9a%84%e7%bb%8f%e9%aa%8c%e4%b8%8e%e6%8a%80%e5%b7%a7-%e7%ae%80%e5%8c%96%e4%bb%a3%e7%a0%81-%e5%a2%9e%e5%bc%baLog/" &gt;有关宏定义的经验与技巧-简化代码-增强Log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/17/what-is-autoreleasepool/" &gt;@autoreleasepool-内存的分配与释放&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/21/effective-objective-c-5-enum/" &gt;Enum-枚举的正确使用-Effective-Objective-C-读书笔记-Item-5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/03/29/bind-data-to-gcd-queue/" &gt;为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/04/03/something-about-gcd/" &gt;GCD使用经验与技巧浅谈&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/04/19/thrift-example-cpp-and-php/" &gt;RPC框架Thrift例子-PHP调用C++后端程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/04/21/resizable-nstextattachment/" &gt;UITextView编辑时插入自定义表情-续-自定义表情图片的大小&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/05/23/autolayout-example-with-masonry/" &gt;有趣的Autolayout示例-Masonry实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/07/08/fill-nil-property-of-object/" &gt;用Runtime的手段填充任意NSObject对象的nil属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/07/25/compatibility-with-macro-category-and-runtime/" &gt;解决iOS项目的版本兼容问题-结合宏、Category和Runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/08/08/autolayout-example-with-masonry2/" &gt;有趣的Autolayout示例2-Masonry实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/10/09/ttgsnackbar-lib/" &gt;Swift写的库-TTGSnackbar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/10/25/ttgemojirate-lib/" &gt;Swift开源项目: TTGEmojiRate的实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/12/14/autolayout-example-with-masonry3/" &gt;有趣的Autolayout示例3-Masonry实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2015/12/31/TTGTagCollectionView/" &gt;开源项目-TTGTagCollectionView&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2016"&gt;&lt;a href="#2016" class="header-anchor"&gt;&lt;/a&gt;2016
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/03/29/modular-and-component-summary/" &gt;对组件化与模块化的思考与总结&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/04/10/summary-of-code-organization/" &gt;总结一些iOS项目中组织代码的方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/04/30/autoreleasing-meet-autoreleasepool/" &gt;结合访问Out Parameters出现EXC_BAD_ACCESS的例子，反编译汇编解读__autoreleasing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/05/02/design-json-api-respoense/" &gt;API返回结果设计经验与总结&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/06/19/translation-why-objcmsgsend-must-be-written-in-assembly/" &gt;翻译-为什么objc_msgSend必须用汇编实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/08/06/autolayout-example-with-masonry4/" &gt;有趣的Autolayout示例4-Masonry实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/08/28/TTGBingWallPaper/" &gt;Swift开源Mac App - BingWallPaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2016/12/25/TTGPuzzleVerify/" &gt;开源项目-拼图验证控件TTGPuzzleVerify的实现&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2017"&gt;&lt;a href="#2017" class="header-anchor"&gt;&lt;/a&gt;2017
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2017/03/08/quartzcode-demo-star-animation/" &gt;用QuartzCode快速实现一个收藏动画&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2017/03/11/TTGDeallocTaskHelper/" &gt;在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2017/03/12/autolayout-example-with-masonry5/" &gt;有趣的Autolayout示例5-Masonry实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2017/03/14/xcode8-crash-on-out-parameter/" &gt;反编译分析Xcode8的Bug, release下连续两次调用有二级指针参数的空方法会Crash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tutuge.me/2017/04/08/diy-methodSignatureForSelector/" &gt;反编译分析并模拟实现methodSignatureForSelector方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;这次整理之后再看，过去这些文章其实大致围绕几个关键词：&lt;strong&gt;工程结构、Objective-C 底层、UI 实现、性能优化、开源封装&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;单篇文章写的时候往往只是解决一个具体问题，但放在一起看，就能看到当时学习和做项目的路径：先解决页面和业务问题，再关注代码组织和模块拆分，最后慢慢深入到 Runtime、内存管理和反编译验证。&lt;/p&gt;
&lt;p&gt;隔了 9 年再重新开始写博客，感觉像是把一个很久没打开的项目重新拉起来。代码可以重新编译，文章也可以继续更新。AI 工具会让整理和表达的成本更低，但真正值得记录的，还是项目里遇到的问题、做判断时的取舍，以及过一段时间后依然能回头看的经验。&lt;/p&gt;
&lt;p&gt;后面新的文章也会沿着这个索引继续补充。这样博客就不只是按时间堆在一起，而是能变成一份可以回头查、也可以顺着阅读的技术笔记了。&lt;/p&gt;</description></item></channel></rss>