收藏的开源项目以及部分分析。

AVPlayer

功能比较完善的一个视频播放及界面,但是实现较为一般。

基于流来构建音频播放,是一个思路,但可能不能满足特殊情景。

利用GPUImage做滤镜的一个直播录制系统,功能比较完善,可以作为参考。

比较简单的基于AVPlayerLayer的一个实现。

没太大参考意义。

音频的波形分析和展示,利用了accelerate,比较全面。

Cache

使用了LRU策略

内存缓存使用了线性链表+NSDictionary来实现,由于LRU的特性,插入永远在开始,而删除永远在结尾,所以拥有较高的性能。但是查找还是依赖于hash表来实现。

磁盘缓存使用了sqlite来保存文件缓存信息(filename, last_modify_time),所以在读写小数据的时候(20KB)会直接在sqlite中读写,而不会生成一个独立的文件。所以在小文件和未命中的情况下效率会高很多。而读写大文件时,效率会降低一些,考虑到sqlite的缓存和执行,并不会降低太多。由于sqlite对时间创建了索引,所以在缓存过期查找上面会优秀一些。这种设计解决了小文件和未命中的效率问题,但是并不能实现高并发读写文件。

使用了大量的Lock来处理读写,拥有异步读写接口,没有太多的特别优化。

磁盘缓存单纯使用了文件缓存,在初始化的时候就把整个目录及其元素的属性读到内存,来提高效率,但是使用的是数组存储,效率一般。

利用CRC32来校验文件,据说速度较快。

他将数据信息通过memory map的方式写到了文件头部,说是为了并发读写,但这也时每次更新updateTime需要写整个文件,这样必定会导致性能降低。个人建议还是把文件信息写到另一个文件中,方便内存缓存。

一个模仿NSCache的实现,内部使用NSDictionary。

  • Haneke 1775 Stars Objective-C

他和SDWebImage非常相似,个人看来,这个的代码及其结构会比SD好一些,但是功能太有限,就像作者自己说的是一个轻量级的实现。

实现功能非常完善,是目前最好用的一个图片缓存库了。但是也有几个小问题。

图片读取全部在一个子线程中进行,在高并发读取的时候会阻塞线程,同样下载和解码也会有类似的问题。

图片的二次处理能力不够(比如手动加圆角,裁剪,滤镜),好在目前大部分工作CDN都会帮我们做掉。

预加载图片无法和正常加载使用同一套机制,预加载和正常加载如果同时触发会加载2次。

在扩展方法的时候,直接在UI组件上添加方法,这就导致了每次引入新特性的时候都需要增加一个系统类的扩展(比如UIImage),更好的方式应该是暴露一个代理对象:

[view sd_setImageUrl:url];
// 改为这样会更好一点
[view.sd setImageUrl:url];

该作者认为效率问题主要出现在图片从磁盘读取到内存,再进行解压,以及渲染前的内存拷贝。解决这类问题的最好方法就是进行memory map,作者也指出了这种方式会导致一张高压缩率的图片,进行内存映射后会变得很大这一非常大的缺陷。

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
int msync(void *addr, size_t len, int flags)
int munmap(void *start, size_t length);

作者将图片按照图片size,rgba等信息进行分类,分别存储于不同的image table里面,同一个table里面会依次写入多张图片信息。但是这样会导致一个table过于庞大,而作者也没有给出非常好的过期策略以及删除部分缓存的策略。

作者将图片元信息metadata存储于另一个文件中,可惜的是使用了json序列化,导致每次更新必须全量更新,在数据量庞大的时候可能会产生性能问题吧。

这并不适用于大量图片以及图片尺寸较多的场景,但是可以用于部分频繁设置image的场景。

Component

也是一款拆分CollectionView的设计,个人认为拆分的太细了,导致整个系统过于复杂,学习成本太高。

将客户端的架构和服务端service结合,从而实现整个app的组件化。本身服务端和客户端在很多方面就不一样,需要更多的情景考虑。他的实现在有些场景还是不够的灵活,但是其思想可以借鉴下。

事件驱动的collectionView组件化封装。具体参考IGListKit简析与DDComponent

类似于React方式,使用component来布局UI。完全颠覆了传统的架构和编码方式,学习成本高。项目复杂,由objective-C++编写,利用了大量隐式转换的特性,所以不适用于swift。

Crash Report

Encrypt

非常全面的加密库。

Markdown

Kit

一些扩展,用处不大。

  • YYKit 10852 Stars Objective-C

包含了很多util方法,以及cache,image,text,json2model方面的类库。

没有参考价值

可以将他的功能归为两类:

1, sequence,swift中自带的概念,和reactive的概念一致,是一种流式的写法。
2, 动态delegate,实现动态delegate的转换,从而实现了大量UI层的回调简化。

功能比较多,除了sequence和UI层的事件外,还有associate object、perform以及KVO(和KVOController类似)。如果是objc开发,可以考虑使用。

主要提供了两个工具:

1, Task,类似于promise,以及reactive,个人觉得不如另外两者。
2, AppLink,一种多平台兼容的跳转方案,同时兼容native和web等,应用面会比MGJRouter这种广一点,但实现上不是非常的完善和通用。

一套非常完善的UI组件库,设计也比较精美,出自腾讯团队。本人认为他也有几个的缺点,那就是利用了大量的Runtime特性,导致很多系统方法都被hook了,这可能会带来某些隐患。由于很多方法都是在系统类上加的,所以api并不是很美观,总是有qmui_这样的前缀。同时hook了UI层的东西,所以如果使用原生的组件也势必会带上一些QMUI的东西。

NavigationBar交互动画的修正采用的是在controller.view上加上一个只设置了背景的navigationBar,同时隐藏原生的navigationBar来实现。相比于另一种使用navigationController再套一层每个controller,从而让每个controllernavigationBar相互独立,本人认为QMUI的方式更加优秀,影响面更加小,毕竟不会影响到整个controller的栈结构。

Util

一个类似于reactive中sequence的工具类,建议直接使用Reactive。

非常有名的几个宏定义的出处,对宏的理解和运用都非常厉害,但是平常经常使用的也就那么几个。

@strongify()
@weakify()
@onExit{}

Data

原来的SBJson,建议使用系统方法。

JSON转model,缺点是必须继承于JSONModel基类。

增加了active事件,没什么用。

包括了网络请求,json转model,以及到core data,如果有这些方面的需求可以尝试下。

建议使用系统方法。

  • Mantle 10744 Stars Objective-C

JSON转model,但是要继承于基类。

一个diff工具,用于CollectionView的reload。

也是一个CollectionView reload的diff工具。

有序字典,意义是?

自动NSCoding,还不是特别通用。

利用获取property来自动NSCoding。

KVO

对象绑定思想也是使用associate object,同时也hook了dealloc。但是很多地方使用了assign而不是weak。不推荐使用

他提出一个事务的概念,将众多变更一次性提交,但好像没什么太大的意义。

FB出品,使用associate object管理内存和负责移除KVO,非常良好的实现方式,推荐使用这个。

hook dealloc来负责移除,需要自己来保证observation的生命周期,使用上不如FB的方便。

hook dealloc来负责移除监听。

DB

利用sqlite做的一个简单的KV存储。

利用sqlite做的一个KV存储,会保存数据元信息和对象间的关系,优化了多线程读写。

和sqlite一样,也是一种关系型数据库(这里讨论本地的realm)。

数据保存方式为内存映射,按照realm的说法是sqlite在读取保存数据时候会产生内存拷贝而影响性能。

数据按照列(column)来保存,每一列的数据格式是固定的,在查找效率上也会提升。同时列拥有不同的chunk来同步到磁盘,这样在读写的时候可以只锁定目标chunk而达到高并发读写。

数据结构实现为B+树,与sqlite使用的B树不同,B+树保证了叶子节点存储的连续性。

sqlite的轻量级封装,缺少ORM,但是也非常简单,容易debug。在少量场景的情况下推荐使用。

SQLCipher is an SQLite extension that provides 256 bit AES encryption of database files.

微信封装的sqlite ORM。支持多线程和数据修复,支持数据加密,用接口的方式强制格式化sql语句,功能比较强大,缺点是必须使用c++来实现其model,实现也较为复杂。如果在这方面需求量不大的情况下,没有必要迁移。

其sql拼装是字符串累加,而不是从语法树生成,所以必须依赖底层sqlite的存储方式。

基于leveldb,对齐进行了多线程以及ssd的优化。

是基于Google的big data实现的一套KV存储,原理简单的说就是每次操作(增删改),都是生成一条数据,存入文件,在一定的条件下,会对这些文件进行merge操作,来保证文件的大小。这种方案解决了高并发写的问题,但是增加了读的开销,是一种折中方案。在移动端的场景下好像没有这么高的并发写场景,应该没有必要使用。

数据结构使用跳跃链表(skip list)来实现,他比B/B+数的实现简单,同时也有不错的性能。

Notes

源码分析笔记,有些地方过于详细了。

一些资源以及博客等整理,比较老了,偏向新手。

Parse的一些列分析文章。

iOS面试题集锦

iOS博客集合。

iOS博客集合。

IOS安全学习资料汇总

Network

网络质量检测

swift of DFImageManager

In-App Purchase

Objc Runtime

Method swizzling

MRC时代的weak实现,可以作为参考。

一个比较全面的hook库,一般用于测试。

runtime方法的objc封装。

用来hook C方法。

非常有名的利用js来动态hook的库。主要通过将:转换为_来实现函数签名的通用,同时格式化js代码,使.调用变为.__c()的方法调用。

和其他(react-native等)的思想不同,不会收集oc的方法签名,然后转到js中生成函数,使用的是修改js代码的方式,但会让debug变得困难,个人更倾向于react-native这种方式。

Socket

Web Socket

Template

Theme

一种换肤框架实现,缺点也非常多,支持的属性也比较少,本人实现了一个更加简单完善的版本DDSkin

  • Tweaks 4622 Stars Objective-C

Util

NSDate的Helper类,比较简单。

NSDate的Helper类,比较全面。


Router

  • routable-ios 1600 Stars Objective-C

  • HHRouter 1393 Stars Objective-C
    这两个都是类似的实现,比较简单。

  • JLRoutes
    脱离UIKit,非常好用的一个实现,据说性较低,没有实际验证过。

  • MGJRouter 1040 Stars Objective-C
    蘑菇街的实现,算法经过优化的JLRoutes,实际没有验证过。

  • CTMediator 1212 Stars Objective-C
    使用中间人来解决路由系统,使用target-action方式注册行为,

Hybrid

一款模仿ios和android原生特性的h5组件库,效果来看很不错,可以使用vue和react,如果是写纯网页应用可以考虑使用这个。

1.4k贡献者,社区非常活跃,目前最热门的方案。拥有非常完善的debug方式以及各种工具,同时React的发展也特别的好。可以完成整个app的功能,也可以作为app的一部分嵌入使用。首推。

大部分组件可以支持iOS和Android,也有很多定制化的组件,所以有些时候需要区分平台来写,也不能无缝降级h5。

和react-native竞争的产品,由阿里出品。框架会比react-native小一点,但功能也会少很多,排版是受阉割的flex,和官方所说的无缝降级h5有出入。一份代码能够同时在iOS和Android上运行,但为了统一也失去了很多的系统特性,感觉没有官方吹的那样厉害。

webView中js与native交互的库。一种简单的实现,如果需要更复杂的实现可以使用cordova。

利用webview js和native的通信实现web端调用native方法。

原理和JSWebviewBridge类似,利用的都是iframe和messageQueue,require组件是直接在head中插入script实现,不知道在组件变多的情况下是否会影响性能,考虑到lazy load的情况,可能会好一点。

组件需要自己根据需要添加,组件比较全面,该有的都有。

但是iOS端是基于UIWebView实现的,不知什么时候能够替换成WKWebView,来提升性能。

基于cordova和react的云端服务

利用xml来实现布局,目前已经废弃。

利用css和html来实现布局和事件绑定,但是实现还是需要原生代码,所以不能独立的去实现一个页面的功能。

腾讯的加速web载入速度的库,原理其实就是客户端增加native缓存管理,减少获取某些静态文件的请求时间。

iOS版依赖于NSURLProtocol,是基于UIWebView实现的,不能支持WKWebView。

其中获取js运行上下文用了黑科技。

[self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

基于cordova的一款h5组件库,效果很不错,增加完善了很多native组件,使用的是Angular

也是一个UI组件库

阿里首页的实现方式,可以认为是一种模板技术,需要客户端开发业务模板,用在业务比较稳定的场景,局限性较大,但是版本更新成本较低,维护成本低。平时设计接口的时候可以参照这种模板方式来配置。

可以认为是一种完整的DSL,功能还是挺强大的,列表使用UITableView,布局系统使用UIStackView,因此也有很大的局限性。

同时编辑JSON文件也是非常麻烦的事情,没有很好的工具可以支持。不太推荐使用,除非支持更灵活的布局和编辑。

UI

Image

是目前最好用的一个GPU计算的框架。利用OpenGL来处理图片,需要对OpenGL比较熟悉,会写GLSL,熟悉图片处理才能创建自己的filter。

架构是流式结构,filter也是流的一部分,既是input也是output

当存在多个filter的时候,优化工作也比较难以进行。比如scale和rotate可以合并为transform。

由于是顺序结构的方案,所以就不能采用多线程多render buffer来优化cpu部分的性能,如下。

CPU: filter1 |  idle   | filter2 |   idle   |
GPU:  idle   | filter1 |   idle  |  filter2 |

优化:
CPU: filter1 | filter2 |  idle   |
GPU:  idle   | filter1 | filter2 |

animation

功能类似于Lottie。

利用AE生成JSON文件来简化交互动画的编写。

多种时间函数实现。

依靠CADisplayLink来达到高帧率的动画效果。但是太依赖CPU,所以性能不一定比CA优秀。一般情况下感觉不太需要他来做动画。

一种动画的封装,意义不大。

  • Canvas 5233 Stars Objective-C

将动画集成到了View中,感觉没什么必要。

和popping原理类似,使用CADisplayLink,实时去修改视图属性。

YapAnimator(initialValue: square.frame, willBegin: { [unowned self] in
    return self.square.frame
}, eachFrame: { [unowned self] (animator) in
    self.square.frame = animator.current.value
})

看似比popping简单点,但是popping是模仿CoreAnimation做的,所以没有可比性。建议使用popping。

一系列的动画效果。

ActionSheet & Menu


path style menu

path style menu

Animation 各种动画

swipe

不同方向的转场动画

开机启动画面方案,有点像ppt的动画方案

启动引导页方案,样式比较固定

一个图片全屏展示的方案,问题多多。

大量页面切换的动效。


  • SVGKit 2866 Stars Objective-C

web svg在iOS端的实现,挺有意思。

一个点击音效。

基于POP的动画扩展。

Button


可展开按钮集合

有动效。

Calendar & DatePicker



CollectionView

一个模仿iOS删除app界面,一个demo。

相当于flexbox的一个子实现,建议直接使用flex库,比如yoga。

粘性header footer,实现不好,比较卡。

一种瀑布流实现。

一个排序CollectionViewLayout实现,实现比较好可以作为参考。

图片列表,没什么参考意义。

swizzle了reload方法来检测是否为空列表,从而来显示空状态。由于使用了黑科技,可能会对其他内容会有未知影响。

折叠动画

Color

扁平化颜色集合。

  • color 544 Stars Objective-C

UIColor扩展。

一种比较漂亮的颜色集合,以及一些颜色转换方法。

UIController

全屏手势返回。通过KVC获取target,然后设置为第三方gesture的target,从而实现gesture替换的效果。

Android风格侧滑抽屉

利用KVC修改系统tabbar,由于是私有api,可能不安全,不是特别建议。

多种页面切换动画。

Chart

分时k线图

Chat

数学公式

ImagePicker

图片裁剪

ImageView

Layout

Layout-DSL

Keyboard

Map

修改NavigationBar的frame来达到和滚动行为同步,没有参考价值。

将真正的NavigationBar的背景等转移到fake bar上,fake bar加在controller.view上,来达到这种效果。微信的实现

使用UINavigationController包裹一层,从而达到每个controller的NavigationBar是独立的。云音乐的实现。

和KMNavigationBarTransition类似,只是并不是直接使用UINavigationBar来做fake bar,而是采用截屏+addLayer来做。

News

  • TTNews 635 Stars Objective-C

一个demo性质的东西。

Password

一个登录界面实现。

Touch ID和key chain共同实现验证的功能。

密码及界面

PDF

一个功能完善的PDF阅读器,但是有些小问题。

  • Reader 3907 Stars Objective-C

一个比较完善的PDF组件,包含图片、链接。利用了CATiledLayer来分块绘制,优化性能。

同Reader,但是是基于PDFium的实现。

Progress

非常有名的loading。

非常有名的loading。

SV与MB,MB功能更加多一些,SV设计上更好一点,各有优势。

多种样式loading。

非常丰富的多样式loading以及progress。

screenshot

screenshot

Push

  • Knuff 3875 Stars Objective-C

工具:The debug application for Apple Push Notification Service (APNs).

Refresh

ScrollView

TextView

TableView

利用[view sizeFittingSize:UILayoutFittingCompressedSize]来计算最小高度。

左右滑动删除实现,需要继承于其cell。

左右滑动删除实现,需要继承于其cell。

左右滑动删除实现,需要继承于其cell。

利用model直接布局tableView的方案,比如登录、注册这种页面,难以定制化。

Label

一个比较好用的扩展UILabel富文本支持,但是也有一些bug没有修复。

Other

时间线

粘性效果

快速移动时候的模糊效果。利用了CoreImage的自定义Filter,利用了Core Image Kernel Language,有点像OpenGL的GLSL

近似高斯模糊算法

利用vImage进行模糊。

就是AsyncDisplayKit

利用cocos2d来手指画图,达到流畅的效果。

一种签名实现。

一种在nib中动态load另一个nib中的内容的实现。


Debug

  • FLEX 8426 Stars Objective-C

一款非常完善的内置debug工具。包含视图查看、log、查看沙盒数据等等功能。

已被删除

非常有名的log工具

bug反馈,截屏功能。

  • Clue 238 Stars Objective-C

在一个bug反馈前,收集用户信息,包括录制视频。

依赖FBRetainCycleDetector来做的内存泄露分析。

开机启动自修复,判定开机崩溃,进入修复流程。微信就有这样的功能。

一个比较完善的debug工具集。

不需要越狱注入其他app的工具。

利用NSURLProtocol来观察网络请求状况,是一个内置的查看工具。

多模拟器选择。

利用了associate object来监测对象生命周期,局限性太大。不过可能会持续更新

利用FBRetainCycleDetectorFBAllocationTracker做的一款工具,增加UI界面。

利用objc的特性,利用Object、block等的属性布局收集强引用信息。

hook了+alloc-dealloc来统计objc对象使用情况。

iOS视图结构查看器,需要通过http查看,还包括core data查看。

和设备通信的类库。

Test

  • ocmock 1558 Stars Objective-C

使用NSProxy对象替代原本的对象,在response和forward中记录和处理、转发消息来实现,是非常好用的mock类库。由于完全依赖oc的动态特性,所以对swift类无效。

类似于ocmock,关注度不高。

  • KIF 5049 Stars Objective-C

利用了私有方法,在非UI Unit test中进行UI测试。

  • expecta 1406 Stars Objective-C
  • specta 2058 Stars Objective-C
  • cedar 1141 Stars Objective-C++
  • Kiwi 3671 Stars Objective-C

以上几种都是BDD方式的封装。

可以认为是一些语法糖

hook http请求

知名度比较高的测试断言库。

知名度比较高的BDD。

React

Other

应用权限

二维码

通讯录

雷电口传输数据

USB数据传输

app和extension的数据传输

使用Chrome来debug view

音乐播放器for mac