出处大神git_iOS---学习研究大牛Git高星项目YYCategories(一)
进行iOS开发已经很久了,但是一直没有静下心研究Git上一些大神写的优秀工程。现在下定决心开始从零开始,仔细研读并敲写一遍大神工程。首先我准备研究的是 ibireme 大神的YYKit工程。这个工程比较庞大。而且这是ibireme大神在零散时间敲出的高质量代码。向大神致敬。
其中包含:
下面附上大神的一句话,与君共勉。
“我花费了大量的时间阅读和学习各种开源的代码、研究其中的实现原理、尝试自己实现相关技术、尝试在工作中使用,这使得我在 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()# include
#elif __has_include()# include
#else# error"Insane system"
#endif
而且他还有其他功能。就是判断是否导入的是framework来决定导入时选用<>还是""。如下代码:
#if __has_include()#import
#import
#else
#import "NSObject+YYModel.h"
#import "YYClassInfo.h"
#endif
这样做可以提高编译效率.如果指定文件路径,则搜索的更快一些.
一般我们使用YYCategories导入的时候都是库文件,所以指定目录位置搜索更快一些
#import < >引用系统文件,它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.#import " " 用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查
tip2: FOUNDATION_EXPORT
这个是一个宏定义的标志,和#define一样。
在YYCategories中定义了但是没有用到。
使用方法:
.h文件中:
FOUNDATION_EXPORT NSString* constkTestString;
.m文件中:
NSString* const kTestString = @"Test";
功能类似于:#define kTestString @"Test";
优点:
由于过多的宏定义会产生过多的二进制文件,故如果宏定义比较多,建议用FOUNDATION_EXPORT。而且FOUNDATION_EXPORT效率更高,速度较快。
原因:
FOUNDATION_EXPORT直接使用
stringInstance == MyFirstConstant来比较,比较的是指针地址
define使用
[stringInstance isEqualToString:MyFirstConstant]
比较字符串的每一个字符是否相等
FOUNDATION_EXPORT效率更高
出处大神git_iOS---学习研究大牛Git高星项目YYCategories(一)相关推荐
- iOS---学习研究大牛Git高星项目YYCategories(三)
转载请注明出处!!! 本文是接着上一篇博客iOS---学习研究大牛Git高星项目YYCategories(二) 大神果真是大神,一个简单的宏定义类,就有如此多的需要注意的地方.在一篇文章中写篇幅过长就 ...
- iOS---学习研究大牛Git高星项目YYCategories(二)
转载请注明出处. 本文是接着上一篇博客iOS---学习研究大牛Git高星项目YYCategories(一) 三.YYCategoriesMacro.h 一个宏定义类,我会把这一块的功能说一下. tip ...
- iOS---学习研究大牛Git高星项目YYCategories(一)
转载请注明出处!!! 进行iOS开发已经很久了,但是一直没有静下心研究Git上一些大神写的优秀工程.现在下定决心开始从零开始,仔细研读并敲写一遍大神工程.首先我准备研究的是 ibireme 大神的Y ...
- iOS---学习研究大牛Git高星项目YYCategories(四)
今天开始研究YYCategories的Foundation扩展类. 它包含了作者对14个Foundation框架的扩展.在详细研究每一个扩展类前我发现了一个小知识点. NS_ASSUME_NONNUL ...
- 25天Maya大神综合学习包「教程 软件 模型库」!月薪5万不是梦
Maya是美国Autodesk公司出品的世界顶级的三维动画软件,应用对象是专业的影视广告,角色动画,电影特技等.Maya功能完善,工作灵活,易学易用,制作效率极高,渲染真实感极强,是电影级别的高端制作 ...
- Git学习系列之Git基本操作提交项目(图文详解)
前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...
- 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)
目前,国外计算机界评价学术水平主要是看在顶级学术会议上发表的论文,特别是在机器学习.计算机视觉和人工智能领域,顶级会议才是王道.本期我们盘点了2019年人工智能领域的顶会,如最核心的顶会AAAI.IJ ...
- 独家 | 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)
目前,国外计算机界评价学术水平主要是看在顶级学术会议上发表的论文,特别是在机器学习.计算机视觉和人工智能领域,顶级会议才是王道.本期我们盘点了2019年人工智能领域的顶会,如最核心的顶会AAAI.IJ ...
- 求大神带我研究MX模式邮件发送
本人了解邮件已经几个月了,因为没有接触过学习过这个行业,想找一个师傅有偿学习.有兴趣的大神可以联系我!深谢!
最新文章
- 干货|了解机器学习常用数据预处理
- 获取浏览器窗口宽高问题总结
- docker 发布tomcat项目_Docker部署java项目[tomcat环境]
- 如何在keil下实现单工程多目标的设置(选择性自动编译)
- 大数据:Parquet文件存储格式
- 不用+、-、×、÷数字运算符做加法
- ActivityMQ使用
- 个人成长(学习方法)
- 安装Oracle中文乱码
- 文字栅格化剪切蒙版——创建文字遮罩效果的两种方法——梦幻游乐园
- 关于AMD 245支持DDR3内存的问题
- Web服务器及性能优化
- U3D常用介绍,搭建一个简单的三维效果
- 电脑如何设置定时任务、定时执行 —— 不用Windows任务计划程序,也能轻松设定计划任务、定时任务 —— 定时执行专家
- Malformed \uxxxx encoding问题的多种完美解决方法总结
- C语言 第六章 多重循环
- iOS MP3流媒体播放 边缓冲边播放 FreeStreamer框架
- 【2021中国科创好公司】评选榜单重磅发布!常垒资本投资“威努特”和“捷配”入选!...
- ADODB类库——数据库管家(一)
- MATLAB程序设计与应用(第三版)刘卫国 答案(一)
热门文章
- 网页编辑器的快捷键及常用操作
- linux 超级终端
- 毕业两年的大专生程序员工作总结(java后端)
- 南方基金-系统开发工程师-一面二面
- Build:failed
- linux amba机制,AMBA仲裁器仲裁机制
- thinkphp Mysql MATCH() AGAINST() 的用法和 写法
- web渗透—暴力破解
- 【前端学习笔记 CSS系列二十二】justify
- 有没有测试游戏天赋的软件,测测你的电竞天赋-测测你的电竞天赋有多高小游戏v1.0...