美文网首页
YYModel源码分析(二)

YYModel源码分析(二)

作者: Devbrave | 来源:发表于2019-05-14 14:38 被阅读0次

    前言

    YYClassInfo该文件中定义了四个类,要了解这四个类我们需要了解一些runtime的知识。

    YYCLassInfo

    下面介绍一下YYCLassInfo中关类的相关理解。

    YYClassInfo.png
    • YYClassIvarInfo该类对应描述的是实例变量(ivar),包含相关的信息ivar结构体、名字、偏移量、类型编码、类型。
      初始化方法- (instancetype)initWithIvar:(Ivar)ivar;主要是实现ivar实例变量与YYClassIvarInfo的转化。

    • YYClassMethodInfo类中方法相关的信息,包含方法(Method)、名字、sel、imp、类型编码、返回值类型编码、参数类型编码。
      初始化方法- (instancetype)initWithMethod:(Method)method;实现了结构体MethodYYClassMethodInfo的转化

    • YYClassPropertyInfo属性相关的信息,包含objc_property_t结构体、属性名、类型、类型编码、实例变量(ivar)名、类等。
      初始化方法- (instancetype)initWithProperty:(objc_property_t)property;实现了objc_property_t到YYClassPropertyInfo的转化

    • YYClassInfo类相关的信息,包含YYClassIvarInfoYYClassMethodInfoYYClassPropertyInfo等。
      - (void)setNeedUpdate当类发生了变化时需要调用该方法以更新缓存中类的相关信息。调用该方法后方法- (BOOL)needUpdate;会返回YES表示你可以使用+ (nullable instancetype)classInfoWithClass:(Class)cls或者+ (nullable instancetype)classInfoWithClassName:(NSString *)className方法回去更新后的类的信息。也可以使用这两个方法初始化YYClassInfo

    拓展

    • NS_OPTIONSNS_ENUM
      NS_ENUM一般用于通用枚举
      NS_OPTIONS一般用于定义位移枚举,使用一个变量保存多个枚举值时。
      举个例子如系统中UIViewAutoresizing的定义如下:
    typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,//0000 0001
        UIViewAutoresizingFlexibleWidth        = 1 << 1,//0000 0010
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,//0000 0100
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,//0000 1000
        UIViewAutoresizingFlexibleHeight       = 1 << 4,//0001 0000
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5//0010 0000
    };   // 赋值
    

    要实现视图的宽高自适应一般如下定义:

    UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    

    转换为二进制计算:

    IViewAutoresizing resizing = 0000 0010 | 0001 0000;
    

    这样就实现了变量保存多个枚举值。那么如何判断变量是否包含某个枚举值了,这的通过与操作。比如我要判断是否包含了UIViewAutoresizingFlexibleWidth

    if (resizing & UIViewAutoresizingFlexibleWidth) {
           // UIViewAutoresizingFlexibleWidth is set
    }
    

    对应的二进制:

    if (00010010 & 00000010) {
    }
    

    00010010 & 00000010很明显不等于0,所以返回的事YES。那么用不包含的试一下。

    if  (resizing & UIViewAutoresizingFlexibleLeftMargin)  {
    }
    

    对应的二进制:

    if  (00010010 & 0000 0001)  {
    }
    

    可以看出00010010 & 0000 0001 = 0,所以能够知道resizing不包含UIViewAutoresizingFlexibleLeftMargin
    通过以上的这种方式实现了一个变量保存多个枚举值。也就是NS_OPTIONS的原理。

    相关文章

      网友评论

          本文标题:YYModel源码分析(二)

          本文链接:https://www.haomeiwen.com/subject/nzpsaqtx.html