转载请注明出处!!!

  进行iOS开发已经很久了,但是一直没有静下心研究Git上一些大神写的优秀工程。现在下定决心开始从零开始,仔细研读并敲写一遍大神工程。首先我准备研究的是 ibireme 大神的YYKit工程。这个工程比较庞大。而且这是ibireme大神在零散时间敲出的高质量代码。向大神致敬。

其中包含:

- YYModel — 高性能的 iOS JSON 模型框架。

- YYCache — 高性能的 iOS 缓存框架。

- YYImage — 功能强大的 iOS 图像框架。

- YYWebImage — 高性能的 iOS 异步图像加载框架。

- YYText — 功能强大的 iOS 富文本框架。

- YYKeyboardManager — iOS 键盘监听管理工具。

- YYDispatchQueuePool — iOS 全局并发队列管理工具。

- YYAsyncLayer — iOS 异步绘制与显示的工具。

- YYCategories — 功能丰富的 Category 类型工具库。

下面附上大神的一句话,与君共勉。

“我花费了大量的时间阅读和学习各种开源的代码、研究其中的实现原理、尝试自己实现相关技术、尝试在工作中使用,这使得我在 iOS 开发技术上进步很快。自学能力是很重要的。主动去研究一些优秀的开源项目、多在工作中实践和学习,这样就能逐步提升个人技术水平了。”                                  ——— ibireme

一、YYCategories结构

现在是最开始,我首先模仿的是YYCategories这个类库。首先先了解下这个类库的结构。

它由外面的YYCategories头文件、YYCategoriesMacro宏和三大类扩展类组成。下面的三类都是基于里面的扩展类所属的类组成。

(1)YYCategories.h类

这个类是库的头文件。它导入了所有的扩展类。使用的时候只要导入本文件就可使用所有扩展。

(2)YYCategoriesMacro.h类

这个类看名字是宏定义类。

(3)Foundation

这里面包含了这些文件。是对这些文件的扩展。下面会一一使用学习。

(4)UIKit

这里面包含了这些文件。是对这些文件的扩展。下面会一一使用学习。

(5)Quartz

这里面包含了这些文件。是对这些文件的扩展。下面会一一使用学习。

二、 YYCategories.h

原本我以为这个头文件类不会有什么知识点可以get到。结果我还是小瞧了大神的代码。

tip1:#if __has_include()  判断文件是否存在,再导入使用,避免文件不存在的情况;

在工程中,我们常常需要导入一些文件,但是万一什么时候删掉了工程又太大,工程报错。这不就很难找吗。这就有了这个系统宏定义。他首先可以使我们判断这个文件是否存在再导入。就像下面的代码。此宏传入一个你想引入文件的名称作为参数,如果该文件能够被引入则返回1,否则返回0。

#if __has_include(<unistd.h>)
# include <unistd.h>
#elif __has_include(<io.h>)
# include <io.h>
#else
# error "Insane system"
#endif

而且他还有其他功能。就是判断是否导入的是framework来决定导入时选用<>还是""。如下代码:

#if __has_include(<YYModel/YYModel.h>)#import <YYModel/NSObject+YYModel.h>
#import <YYModel/YYClassInfo.h>
#else
#import "NSObject+YYModel.h"
#import "YYClassInfo.h"
#endif

这样做可以提高编译效率.如果指定文件路径,则搜索的更快一些.
一般我们使用YYCategories导入的时候都是库文件,所以指定目录位置搜索更快一些

#import < > 引用系统文件,它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
#import " "  用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查

tip2: FOUNDATION_EXPORT

这个是一个宏定义的标志,和#define一样。

在YYCategories中定义了但是没有用到。

使用方法:

.h文件中:
FOUNDATION_EXPORT NSString * const kTestString;.m文件中:
NSString * const kTestString = @"Test";功能类似于:
#define kTestString @"Test"; 

优点:

由于过多的宏定义会产生过多的二进制文件,故如果宏定义比较多,建议用FOUNDATION_EXPORT。而且FOUNDATION_EXPORT效率更高,速度较快。

原因:
FOUNDATION_EXPORT直接使用stringInstance == MyFirstConstant来比较,比较的是指针地址
define使用[stringInstance isEqualToString:MyFirstConstant]
比较字符串的每一个字符是否相等
FOUNDATION_EXPORT效率更高

转载于:https://www.cnblogs.com/weicyNo-1/p/9207611.html

iOS---学习研究大牛Git高星项目YYCategories(一)相关推荐

  1. iOS---学习研究大牛Git高星项目YYCategories(二)

    转载请注明出处. 本文是接着上一篇博客iOS---学习研究大牛Git高星项目YYCategories(一) 三.YYCategoriesMacro.h 一个宏定义类,我会把这一块的功能说一下. tip ...

  2. iOS---学习研究大牛Git高星项目YYCategories(三)

    转载请注明出处!!! 本文是接着上一篇博客iOS---学习研究大牛Git高星项目YYCategories(二) 大神果真是大神,一个简单的宏定义类,就有如此多的需要注意的地方.在一篇文章中写篇幅过长就 ...

  3. 出处大神git_iOS---学习研究大牛Git高星项目YYCategories(一)

    进行iOS开发已经很久了,但是一直没有静下心研究Git上一些大神写的优秀工程.现在下定决心开始从零开始,仔细研读并敲写一遍大神工程.首先我准备研究的是 ibireme 大神的YYKit工程.这个工程比 ...

  4. iOS---学习研究大牛Git高星项目YYCategories(四)

    今天开始研究YYCategories的Foundation扩展类. 它包含了作者对14个Foundation框架的扩展.在详细研究每一个扩展类前我发现了一个小知识点. NS_ASSUME_NONNUL ...

  5. 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)

    目前,国外计算机界评价学术水平主要是看在顶级学术会议上发表的论文,特别是在机器学习.计算机视觉和人工智能领域,顶级会议才是王道.本期我们盘点了2019年人工智能领域的顶会,如最核心的顶会AAAI.IJ ...

  6. 独家 | 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)

    目前,国外计算机界评价学术水平主要是看在顶级学术会议上发表的论文,特别是在机器学习.计算机视觉和人工智能领域,顶级会议才是王道.本期我们盘点了2019年人工智能领域的顶会,如最核心的顶会AAAI.IJ ...

  7. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  8. 过万 star 高星项目的秘密——GitHub 热点速览 Vol.39

    作者:HelloGitHub-小鱼干 虽然国外十一并不过国庆,但是本周的 GitHub 也稍显疲软,GitHub 周榜的获 star 超过 1k 的项目寥寥无几,本周新开源的项目更是屈指可数.用 C ...

  9. Git学习系列之Git基本操作克隆项目(图文详解)

    不多说,直接上干货! 想必,能进来看我写的这篇博文的朋友,肯定是了解过. 比如SVN的操作吧,最常见的是 检出(Check out ...), 更新 (Update ...), 以及 提交(Commi ...

最新文章

  1. 2018-4-15狼群算法以及改进的总结
  2. vs2010中release模式下调试程序
  3. 渲染到ui_虚幻4渲染编程(UI篇)【第二卷:程序化UI特效-[1]】
  4. python知识:几个排序算法的python实现
  5. linux切换软件版本,Linux中dpkg工具update-alternatives实现符号链接软件版本的切换(转)...
  6. MPlayer在ARM上的移植(S5PV210开发板)
  7. centos 6.9 NTP基准时间服务器配置
  8. 设计模式1—创建型模式
  9. 中国水灭火器行业市场供需与战略研究报告
  10. 10 个非常酷的基于jQuery的菜单效果插件
  11. TensorFlow安装中遇到的问题
  12. Spring 单元测试(Junit)
  13. 四川专利代理机构列表
  14. 小白终是踏上了这条不归路----小文的mysql学习笔记(23)---------流程控制结构
  15. 启中教育:淘宝最有效的投诉电话号码?
  16. 编程累了进来听听音乐
  17. Java learn lambda的方法引用
  18. 今日头条还可以引流么?今日头条引流效果怎么样?
  19. Shell实例:for循环语句实现求奇数和与偶数和——实验+解析,超详细!!!
  20. Win10多用户同时远程桌面的另类解决方案---支持1809和1909和2004版本V2.0

热门文章

  1. 各代iphone尺寸_历代16款iPhone厚度对比:iPhone X 5年来最厚
  2. observable.map 介绍
  3. Java计算商品的促销日期
  4. Android中定位功能的判断与打开
  5. 如何自己搭建本地代理IP池并验证是否可用
  6. 红蓝对抗-红队打点的那些事
  7. 热更新Tinker的集成使用
  8. 最有钱的省都在“争”!海洋类大学,要崛起了?
  9. nohup怎么更改名字_公司相关信息更改、公司注销不可漏缺步骤
  10. 企业非法集资风险预测