美文网首页
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