大屏 iPhone 的适配
这篇讲的是苹果推出 iPhone 6 系列后,iOS 开发者面临的屏幕适配挑战。文章直接切入核心问题:旧工程在新设备上默认以“兼容模式”运行,导致显示模糊。作者总结出两种让应用进入高分辨率模式的有效方法——要么添加对应的 LaunchImage,要么使用 Xcode 6 引入的 Launch Screen 文件。考虑到对旧版 iOS 的兼容性,文章推荐了更稳妥的第二种方案。 文章还深入到了资源显示层面,指出了一个关键差异:iPhone 6 Plus 的设备像素密度更高,需要使用 @3x 图片,并且其内部逻辑分辨率与实际物理分辨率之间存在一个 1/1.15 的缩放过程。对于开发者最关心的屏幕参数,文章附上了一份清晰的对比表格,列出了从 iPhone 到 iPhone 6 Plus 各代设备的 Point 值、像素值、Scale 和 PPI,为具体适配工作提供了直接的数据参考。
深入理解RunLoop
这篇讲的是 iOS/macOS 系统中至关重要的事件循环机制——RunLoop。作者从 CFRunLoop 的开源源码出发,带我们看清了这个底层对象的真实面貌。 文章不止于概念,而是层层深入:解释了 RunLoop 与线程一对一的绑定关系,剖析了 Source(事件源)、Timer、Observer 这三个核心组件的区别与协作,特别是区分了需要手动唤醒的 Source0 和能主动唤醒线程的 Source1。对于 Mode 的机制讲解也十分关键,说明了 RunLoop 每次运行只能处理特定模式下事件的设计意图。 最实用的部分在于,文章详细拆解了苹果是如何基于这套机制来实现自动释放池、触摸事件分发、屏幕刷新(CADisplayLink)、定时器等日常功能的。最后,通过分析 AFNetworking 和 AsyncDisplayKit 这两个经典框架的用法,展示了 RunLoop 在高性能网络监听和界面异步渲染中的巧妙应用,让理论立刻有了落脚点。 通篇将源码逻辑与系统设计结合,不仅解释了“是什么”,更阐明了“为什么这么实现”,对于想穿透 API 层、理解 iOS 系统运行原理的开发者来说,是一次扎实的源码导览。
iOS 处理图片的一些小 Tip
这篇讲的是 iOS 开发中几个容易被忽略的图片处理细节,作者从实际编码经验出发,给出了不少实用技巧。 比如保存 GIF 动图,直接用 UIImageWriteToSavedPhotosAlbum 会转码成 PNG,正确做法是通过 ALAssetsLibrary 的 writeImageDataToSavedPhotosAlbum 来保留原始动图格式。保存 UIImage 到磁盘时,用 NSKeyedArchiver 其实是性能最差的方案,对于不含透明像素的图片,用 UIImageJPEGRepresentation(0.9) 压缩保存反而在编码速度和文件体积上都更优。 文章还深入解释了 UIImage 的缓存机制。通过 imageNamed 创建的图片,其解码数据在第一次显示时才会生成,并缓存在全局缓存中,通常只在 App 退后台或收到内存警告时清空。即使使用 imageWithData 创建图片,底层也会启用缓存。想要避免缓存,可以手动调用 CGImageSourceCreateWithData 并关闭缓存参数,或者更常见地,将图片绘制到画布再取出数据——这也是很多网络图片库采用的做法。 此外,文章还介绍了如何直接获取图片解码后的原生数据、快速判断文件图片类型,以及如何利用 CGImageSource 的 Incremental 方式实现像浏览器那样边下载边显示图片的效果,并对比了 PINRemoteImage、YYWebImage 与 SDWebImage 在这方面的实现差异。
iOS JSON 模型转换库评测
这篇评测文章从实际开发需求出发,对 iOS 平台常用的六个 JSON/模型转换库进行了横向对比。评测覆盖了手动转换(Manually)、YYModel、FastEasyMapping、JSONModel、Mantle 和 MJExtension 这几个主流选择。 文章的核心围绕三个维度展开:性能、功能与容错性。在性能测试中,作者使用了两个典型用例(一个简单的 GitHub User 数据,一个复杂的微博数据),给出了直观的耗时对比图表。结论非常明确:YYModel 的性能显著领先,甚至接近手写代码的效率;Mantle 的性能在对比中最弱;JSONModel 和 MJExtension 处于中间水平。功能上,各库各有侧重,比如 FastEasyMapping 支持 CoreData,但使用者较少。 容错性测试则揭示了更实际的开发体验差异。YYModel 和 Mantle 会进行类型检查以避免崩溃,但处理策略不同:前者尝试自动转换并在失败时留空,后者直接终止转换并向上报错,更利于调试。MJExtension 在自动转换失败时可能直接赋值不匹配的类型,存在潜在风险。 总的来说,文章为开发者选择库提供了清晰的参考:追求极致性能可以看 YYModel,注重稳定和调试体验可考虑 Mantle,而 MJExtension 和 JSONModel 则是在功能与易用性上的常见折中选择。
YYCache 设计思路
这篇讲的是作者从实际需求出发,设计高性能iOS缓存库YYCache的思考过程。他对比了NSCache、TMMemoryCache、PINMemoryCache等主流内存缓存实现,发现它们在性能或功能上各有不足,于是YYMemoryCache采用了OSSpinLock保证线程安全,并实现了LRU淘汰算法,在基准测试中性能表现突出。 针对磁盘缓存,文章分析了基于文件、mmap和SQLite三种技术路径的优劣。作者指出SQLite在存储小数据时性能更优,且便于实现元数据管理和淘汰策略,因此YYDiskCache采用了SQLite结合文件存储的混合方案,在实测中兼顾了性能与功能。 最后,作者还对比了Realm与SQLite的性能差异,并提到Realm会向外部IP发送数据,建议开发者谨慎使用。整篇文章从技术选型到性能评测,为iOS开发者选择和构建缓存方案提供了详实的参考。
移动端图片格式调研
这篇技术调研从移动端流量与视觉体验的双重痛点出发,系统梳理了从老牌JPEG、PNG、GIF到新兴WebP、APNG、BPG的多种图片格式。作者不仅对比了它们在压缩率、透明通道、动画支持等方面的核心差异,更深入到Android与iOS底层编解码架构(如Skia、ImageIO)和具体开源库(如libjpeg-turbo、MozJPEG)的性能剖析。 文章的亮点在于其扎实的实测数据。通过在iPhone 6上对典型图形与照片素材进行编解码测试,直观呈现了不同格式在文件体积、处理速度上的权衡。例如,JPEG在quality 0.9时达到较好的质量与效率平衡;PNG处理照片类图片时体积和速度明显逊色;而WebP凭借其全能特性和广泛的应用,已成为移动端优化的重要选择。 对于关注移动端性能优化的开发者来说,这篇文章提供了清晰的选择指南:WebP是当前均衡且普及的解决方案,APNG在动图上优于GIF,而高压缩比的BPG则代表了未来方向,尽管其仍受版权与计算成本制约。
iOS 保持界面流畅的技巧
这篇深度解析从 iOS 屏幕显示原理入手,剖析了界面卡顿的根源。文章详细拆解了 VSync 机制下,CPU 与 GPU 协同工作的流程,并指出当任一方未能及时完成渲染时,掉帧便会发生。作者系统性地列举了 CPU 侧的对象创建与销毁、布局计算(尤其是 Autolayout 的性能陷阱)、文本渲染等常见开销来源,也涵盖了 GPU 侧的渲染与合成问题。 在剖析原理的基础上,文章重点介绍了 AsyncDisplayKit 框架。作者阐述了其图层预合成、异步并发操作等核心设计,以及如何利用 Runloop 进行任务分发,从而将主线程从繁重的布局和渲染任务中解放出来。 文章更提供了极具实践价值的参考:一个完全仿照微博、Twitter 的开源列表 Demo。通过预排版、预渲染、异步绘制等优化技巧的组合运用,该 Demo 即使在 iPhone 4S 上快速滑动,也能稳定保持 50-60 FPS 的流畅度。这不仅仅是理论分析,更是一份可供验证、对比和直接使用的性能优化方案指南。