• YYKit之YYModel


    原文:http://www.cnblogs.com/lujianwenance/p/5706548.html 
     
    本文主要是对YYModel文件结构的简单分析,能帮助你更快的熟悉和学习YYModel。如有问题,希望能指正,谢谢。
    一、YYCLassInfo文件
         YYClassIVarInfo:存放变量的Model
         YYClassMethodInfo:存放方法的Model
         YYClassPropertyInfo:存放property的Model
         YYClassInfo:存放类信息的Model
         
      
    YYClassIvarInfo:通过Ivar来初始化,赋值相应的需要保存的字段,比较简单。
    YYClassMethodInfo:通过Method来初始化,跟Ivar不同的是,typeEncoding有两个,一个是参数的,一个是返回值的。打印了一个例子,如下图:
    分别是参数和返回值的typeEncoding、返回值的、参数的
    YYClassPropertyInfo:通过objc_property_t来初始化,保存一些相关的信息。
    YYClassInfo:可以通过Class,也可以使用NSString * className来初始化,保存相关类的信息。
     
    二、NSObject+YYModel文件
     这个文件是YYModel的核心,提供了一些,son转model、字典转model、model转NSData、model转Json等方法。
    1、两个model,一个是_YYModelPropertyMeta、一个是_YYModelMeta。
    _YYModelPropertyMeta:
         是对YYClassPropertyInfo的进一步封装,加入了一些操作性的或者说是功能性的封装。比如是否是C number type、是否支持KVC、是否可以被归档、是否有自定义的映射字典等等。还有一个比较特殊的是next,next是指向下一个_YYModelPropertyMeta的指针,他是用来处理多个属性映射到同一个key上时使用的。
    _YYModelMeta:
         是对YYClassInfo一层解析,映射了每个property的key对应的_YYModelPropertyMeta——>mapper、所有的_YYModelPropertyMeta——>allPropertyMetas、所有的解析了keyPath的_YYModelPropertyMeta——>keyPathPropertyMetas、多个key对应的_YYModelPropertyMeta——>multiKeysPropertyMetas、映射了mapper.count——>keyMappedCount、Model class type ——> nsType、以及这个model是否实现了支持dic转model,转成dic和dic转class。
         
    2、内联函数
         1)YYClassGetNSType:获取Class的Foundation class type
         2)YYEncodingTypeIsCNumber:判断YYEncodingType是否是C number(常用数据类型)
         3)YYNSNumberCreateFromID:把一个id类型的值转换成NSNumber类型,这个函数主要是处理string类型的数据。其中使用到了几个c函数,分别如下:
         atop(const char *cstring)返回一个double类型,转换string为double
         isnan(double num) 确定是不是一个数,是否是无穷大或无穷小
         isinf(double num) num为正无穷返回1、num为负无穷返回-1
         atoll(const char *cstring)返回一个long long int 
         4)YYNSDateFormString:格式化时间string
              这个函数适配了Google、Github、Apple、Facebook、Weibo、Twitter的几种时间的格式,通过一个block,使用不同的回调来实现不同的适配。
              其中学到了使用block数组来根据不同的场景,实现不同的回调。
         5)YYNSBlockClass:获得NSBlock类型,再确认属性类型时使用
         6)YYISODateFormatter:从命名可以知道作用
         7)YYValueForKeyPath和YYValueForMultiKeys:使用key或者keys从dic中取得value
     
         8)ModelCreateNumberFromProperty:从_YYModelPropertyMeta中得到Number(使用在属性是number的情况),通过runtime方法objc_msgSend向当前的model发送消息(getter),得到number。
         9)ModelSetNumberToProperty:通过_YYModelPropertyMeta设置property的number(使用在属性是number的情况),同上,给当前model设置数值。
         10)ModelSetValueForProperty:从命名可以看出这个是set property的方法,它根据meta中保存的当前property是什么类型来确定使用什么类型来初始化当前property的值
         11)ModelSetWithDictionaryFunction:对ModelSetValueForProperty的封装,更好的通过解析字典的数据到model中,使用CFDictionaryApplyFunction函数来调用,实现解析字典中的每一个key对应的值
         12)ModelSetWithPropertyMetaArrayFunction:解析多个key对应一个property meta的情况
         13)ModelToJSONObjectRecursive:model转换为json
         
    3、NSObject、NSArray、NSDictionary的分类
         定义接口通过上述的内联函数实现相应的功能,方便外部调用,通过这一层封装就可以简单明了的调用这些方法来实现功能了,具体的使用请看大神@ibireme的使用说明https://github.com/ibireme/YYModel
     
    其中在YYClassIvarInfo、YYCLassMethodInfo、YYClassPropertyInfo中都有一个TypeEncoding的属性,相关的具体内容请查看Type Encoding:官方链接:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html#//apple_ref/doc/uid/TP40008048-CH101-SW5
     
    最后说一下写在 最前面的宏定义,
    #define force_inline __inline__ __attribute__((always_inline))
    从字面意思就可以看出来,是强制内联的意思。 
    inline关键字仅仅是建议编译器做内联展开处理,不是强制的。在gcc编译器中,如果编译优化设置为O0,即使是inline函数也不会被内联展开,除非强制内联。
    1、inline
         inline主要是用来替换C中的表达式形式的宏定义,因为这样的宏定义其实类似于一个函数,但是在宏定义中只是做了简单的符号替换,它不能进行参数有效性的检查,也不能享受编译器严格严查的好处,同时返回值也不能被强制类型转换等等,这样使用宏定义就存在一系列的隐患和局限性。所以出现了inline关键字。
         因此,inline函数也是直接使用的替换(像宏一样),没有了调用的开销,效率比较高。
         inline在文件内部调用时,会被内联展开,但是gcc还是会为inline函数生成一份独立的汇编码以供外部文件使用。gcc的inline函数是全局的,文件内是内联展开,文件外和普通的extern函数一样。
    2、static inline
         也是和inline一样建议编译器内联展开,gcc一般不会为static inline函数生成一份独立的汇编码,但是当函数本身递归:函数的地址被使用(函数指针),也是会不展开的。
  • 相关阅读:
    Manjaro 安装与初步使用
    hp 820 G3 驱动安装不上
    Linux Mint
    PHP模板引擎原理
    报名系统跟商品购物有点类似,可以参考一下他们的ER图
    tp5接口开发流程(思路版)
    mysql中主键和外键的作用,主表和从表如何区分,以及如何使用联合查询和TP5的联合查询
    关于会员-考生-考生自定义表单-预览打印
    PHP unserialize()和serialize两者的用法
    如何解决复杂的问题?如何在未知的领域里,解决需求?
  • 原文地址:https://www.cnblogs.com/lujianwenance/p/5706548.html
Copyright © 2020-2023  润新知