Aspects是一个用于实现面向切片编程(AOP, Aspect-oriented programming )思想的第三方库。面向切片编程,指的是在运行时,动态地将代码切入到类的指定方法、指定位置上,从而得到改变方法的实现的目的。由于 Objective-C 本身是一门非常动态的语言,因此 AOP 在 Objective-C 这门语言中很容易利用 Runtime 进行实现。 继续阅读“Aspects 源码分析”
EasyTuple 源代码分析
EasyTuple
是由美团开源的一个第三方库,它给Objective-C 添加了元组的能力,可以将几个对象包裹在一个对象中,这样我们就可以从一个函数中返回多个值。它的使用非常简单,比如我们想创建一个由两个元素组成的元组,那么可以这样写:
1 2 |
EZTuple2<NSNumber *, NSString *> *tuple = EZTuple(@1, @"string"); |
如果使用 Xcode 辅助编辑器查看预编译后的代码,那么上面的例子在预编译后,会被展开为
1 2 |
EZTuple2<NSNumber *, NSString *> *tuple = [[EZTuple2 alloc] initWithFirst:@1 second:@"string"]; |
可以看到原来的宏的写法会自动被转换成 Objective-C 中的类的创建语法了,那么这个转换过程是怎样发生的呢?下面让我们一步步地去分析这个转换的过程。 继续阅读“EasyTuple 源代码分析”
shared_ptr 的实现
智能指针
shared_ptr 是C++11后引入的智能指针。智能指针的出现大大简化了C++程序员进行内存管理的逻辑,同时也避免了低级C++程序员可能写出的各种bug。陈硕老师在《Linux多线程服务器端编程》中总结道:
C++里可能出现的内存问题大致有这么几个:
1. 缓冲区溢出。
2. 空悬指针/悬挂指针
3. 重复释放
4. 内存泄漏
5. 不配对的new[]/delete
6. 内存碎片正确使用智能指针能很轻易地解决前面5个问题。
shared_ptr 是智能指针中比较典型的一个。下面我们将从源代码的角度来进行分析,看看它是怎么实现的。源代码可以从GNU 处进行下载。 继续阅读“shared_ptr 的实现”
SDWebImage 源代码剖析-网络部分
前面两篇博文中,简要对SDWebImage的缓存部分和多线程部分进行了分析。建议在阅读本篇内容前先看下缓存策略那篇,以对SDWebImage的基本内容有所了解。在本篇中,我们将对它的网络策略进行分析。我们知道SDWebImage的主要功能就是从远程主机上下载图片,所以前面的几个策略都是为这一目的提供支持的,而网络策略的好坏将直接决定库的性能。不过SDWebImage以GitHub上接近20000的star数向我们证明了它不俗的实力,下面就让我们一起看看吧。 继续阅读“SDWebImage 源代码剖析-网络部分”
SDWebImage 源代码剖析-多线程策略
前一篇文章从缓存策略的角度分析了SDWebImage
的部分代码,下面从多线程的角度对它的其他模块进行分析。 继续阅读“SDWebImage 源代码剖析-多线程策略”
SDWebImage 源代码剖析-简介及缓存策略
在上一篇文章中,我们对Masonry
的源代码进行了分析。今天我们将对另外一个在iOS 开发中广泛使用的库的源代码进行分析,这个库就是鼎鼎大名的SDWebImage
。下面是我个人对这个库的主要部分和缓存策略部分的代码分析和理解。由于本人才疏学浅,若有错误,请大家及时指出,不吝赐教。(注:由于写这篇博客的时间是17年3月,从那之后SDWebImage又历经了几个新的版本,因此现在的代码与这篇博客中会有所不同。) 继续阅读“SDWebImage 源代码剖析-简介及缓存策略”
Masonry 源代码剖析
Masonry 是一个用来代替苹果原生的AutoLayout 的自动布局框架。这个库的代码量不是很多,而且使用也很简单方便,那么就让我们深入到这个库的内部,看看它是怎么实现的。