原文: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函数生成一份独立的汇编码,但是当函数本身递归:函数的地址被使用(函数指针),也是会不展开的。

YYKit之YYModel的更多相关文章

  1. 又一个高性能轻量级的iOS模型框架YYModel

    前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...

  2. YYmodel 郭耀源 底层分析

    http://www.tuicool.com/articles/meAzIny         YYModel 简介与使用 http://www.jianshu.com/p/663c7b608ff5 ...

  3. YYModel V1.0.4源码解析

    YYKit出现了很长时间了,一直想要详细解析一下它的源码,都是各种缘由推迟了. 最近稍微闲了一点,决定先从最简单的YYModel开始吧. 首先,我也先去搜索了一下YYModel相关的文章,解析主要AP ...

  4. 经典iOS第三方库源码分析 - YYModel

    YYModel介绍 YYModel是一个针对iOS/OSX平台的高性能的Model解析库,是属于YYKit的一个组件,创建是ibireme. 其实在YYModel出现之前,已经有非常多的Model解析 ...

  5. YYModel 源码解读 总结

    在使用swfit写代码的过程中,使用了下oc写的字典转模型,发现有些属性转不成功,就萌生了阅读源码的想法. 其实一直都知道Runtime机制,但并没有系统的学习,可能是因为平时的使用比较少,无意间在g ...

  6. YYModel 源码解读(二)之NSObject+YYModel.h (5)

    好了,之前的博文中详细的解释了一些辅助的类和辅助的函数,接下来就是使用它们来实现酷炫功能的时候,正所谓磨刀不误砍柴工啊 我们先把总的功能罗列出来 1. json转字典              + ( ...

  7. YYModel 源码解读(二)之NSObject+YYModel.h (4)

    接下来我们继续向下看 typedef struct { void *modelMeta; ///< _YYModelMeta void *model; ///< id (self) voi ...

  8. YYModel 源码解读(二)之NSObject+YYModel.h (2)

    _YYModelMeta   这个内部的类主要是对这个类的描述.包含了和此类转换相关的数据. /// A class info in object model. @interface _YYModel ...

  9. YYModel 源码解读(二)之NSObject+YYModel.h (1)

    本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 ...

随机推荐

  1. _int、NSInteger、NSUInteger、NSNumber的区别和联系

    1.首先先了解下NSNumber类型: 苹果官方文档地址:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/F ...

  2. VB.Net中点击按钮(Button)会重复提交两次表单

    在VB.NET程序开发过程中遇到一个问题 提交一个表单时,button的html代码如下 <asp:Button ID="btnSubmit" OnClick="c ...

  3. 射频识别技术漫谈(13)——Mifare S50与S70【worldisng笔记】

    Mifare S50和Mifare S70又常被称为Mifare Standard.Mifare Classic.MF1,是遵守ISO14443A标准的卡片中应用最为广泛.影响力最大的的一员.而Mif ...

  4. BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

    前面几题是会很基础,越下越有深度. 初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型: ...

  5. C++学习笔记(八):函数重载、函数指针和函数对象

    函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...

  6. 二、FreeMarker 模版开发指南 第二章 数值和类型

    章节内容如下:   基本内容 类型 一.基本内容 简介 什么是数值? 什么是类型? 数据模型是哈希表 a.简介 理解数值和类型的概念是理解数据模型的关键所在.然而,数值和类型的概念并不局限于数据模型, ...

  7. Smack[3]用户列表,头像,组操作,用户操作

    用户列表 Smack主要使用Roster进行列表管理的 connection.getRoster(); /** * 返回所有组信息 <RosterGroup> * * @return Li ...

  8. cocos2d-x 将cocosbuilder输出文件映射成对象的原理

    转自:http://www.cnblogs.com/fox7nights/archive/2013/02/21/2920640.html 一.调用代码 CCNode* GameOverScene::l ...

  9. java 引用类型及作用

    0. 引言 Java 中一共有 4 种类型的引用 : StrongReference. SoftReference. WeakReference 以及 PhantomReference , 这 4 种 ...

  10. JAVA实现的异步redisclient

    再使用redis的过程中,发现使用缓存尽管好,可是有些地方还是比較难权衡,缓存对象大了,存储对象时的序列化工作非常繁重,消耗大量cpu:那么切分成非常小的部分吧,存取的次数变多了,redisclien ...