zoukankan      html  css  js  c++  java
  • iOS---学习研究大牛Git高星项目YYCategories(一)

       转载请注明出处!!!

      进行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效率更高
  • 相关阅读:
    Python 必备神器
    python 常用库
    Sublime Text3 配置 Python2 Python3
    Python JSON
    Sublime Text3 3143 注册码
    EFCode First 导航属性
    EF Code First:实体映射,数据迁移,重构(1)
    Entity Framework 复杂类型
    EF 7 Code First
    EF Code First 导航属性 与外键
  • 原文地址:https://www.cnblogs.com/weicyNo-1/p/9207611.html
Copyright © 2011-2022 走看看