【iOS】——YYModel源码总结

性能优化及优点

YYModel主要用于将JSON数据转换为模型对象,以及将模型对象转换为字典的库。相比于其他的数据转换库例如JSONModel,它更加的轻量级并且性能更高,因为它在很多地方做了优化:

  • 通过CFDictionaryCreateMutable方法将数据存入缓存,需要使用的时候直接拿出,就不用重复解析类,该方法是C语言,相比于JSONModel使用关联对象进行缓存省去了OC的消息发送,性能更高。
  • 并且通过getter和setter方法用JSON数据给模型的属性进行赋值而不是像JSONModel通过kvc赋值从而提高性能。因为前者可以利用编译时优化、静态类型检查以及直接访问底层实例变量。而KVC需要在运行时进行更多的动态查找和类型检查。
  • 在内存管理中大量使用__unsafe_unretained而不是__strong和__weak因为__unsafe_unretained仅涉及简单的指针赋值操作,完全避免了引用计数的增减开销及相关的内存管理和同步操作,因此性能更高。但使用时必须非常小心以避免产生悬垂指针问题。因为__unsafe_unretained指针指向的对象被释放后指针不会置nil还是指向原来的地址,但是该地址的内容已经被释放,访问的话存在安全性问题。(野指针通常指向从未有效分配的内存,而悬垂指针曾有效但对象已被销毁或内存已被释放。)
  • 在处理键值映射和类型转换时,会用到如YYClassIvarInfoYYClassMethodInfo这样的C结构体来存储有关ivar和方法的信息,然后通过纯C函数来操作这些结构体,避免了频繁的ObjC方法调用。
  • 减少遍历的循环次数,在 JSONModel 转换前,Model 的属性个数和 JSON 的属性个数都是已知的,这时选择数量较少的那一方进行遍历,会节省很多时间

YYModel的容错性更好,它会自动进行错误类型检查,如果检查到不匹配的类型会自动赋值为nil。

YYModel无侵入性,它采用类别的方式来实现功能,不同于JSONModel需要模型类继承于JSONModel类

使用注意

对于非容器类属性直接进行转换就行,对于容器类属性,需要指定容器类属性中元素的数据类型,因为容器类例如NSArray和NSDictionary都是类型无关的,如果不指定容器中的元素类型,YYModel就不知道该将JSON数据转换成什么类型的对象

通过modelContainerPropertyGenericClass 方法来制定容器内的元素类型

#import "TestYYModel.h"
@implementation TestYYModel
// 必须要在这个方法中告诉数组类型
+ (NSDictionary *)modelContainerPropertyGenericClass { // 容器类属性没有注明元素属性所属类别return @{@"stories" : [Story class], @"top_stories" : [TopStory class]};
}
@end

架构分析

在这里插入图片描述

结构分为两个部分:NSObject+YYModel、YYClassInfo

  • YYClassInfo 主要将Runtime 层级的一些结构体封装到 NSObject 层级以便调用。例如其中的YYClassIvarInfo是对objc_ivar的封装(包含变量名、变量类型、变量偏移量等)、YYClassMethodInfo是对objc_method的封装(包含方法名和方法指针)、YYClassPropertyInfo是对property_t的封装(包含属性名、属性类型、属性相关协议、getter和setter的方法指针)、YYClassInfo是对objc_class的封装(包含了类名、父类指针、类遵循的协议等)
  • NSObject+YYModel主要负责处理转换的逻辑以及提供接口 这里面转换的逻辑基本上都是用到了YYClassInfo中封装的Runtime结构体

在这里插入图片描述

流程分析

  • 首先JSON数据通过yy_modelWithJSON方法转换为NSDictionary对象,这里的JSON数据格式可以是NSString、NSData、NSDictionary类型
  • 接着在yy_modelWithJSON方法中又会调用yy_modelWithDictionary方法将NSDictionary对象转换为Model类的对象,该方法先将Model类的信息进行提取【包含所有属性的信息、所有属性的key和keyPath的mapper字典等等】生成YYModelMeta类的对象
  • 接着创建一个元字典来存放属性的各种信息比如属性名和属性类型、修饰符,【为了后面验证类型时就能直接通过元字典验证】,在创建元字典的方法中首先会创建缓存来存放解析后的类(YYModelMeta),后面每次解析先访问缓存,如果没找到在创建新的元数据存到缓存中,接着调用initWithClass方法经过黑白名单的过滤自定义属性映射指定容器类属性内元素类型等一系列操作才能得到我们最终存放的元数据的元字典****_allPropertyMetas****(key是属性名,value是属性信息)
  • 建立属性信息和JSON数据之间的映射关系,通过对自定义映射规则的解析,将模型类的各个属性与其在JSON数据中的对应键进行匹配
  • 最后获取JSON数据的字典和解析后的类YYModelMeta,通过yy_modelSetWithDictionary方法将JSON数据通过setter方法赋值给对应的属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145024.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣99, 1305, 230, 897

1. 力扣99:恢复二叉搜索树 1.1 题目: 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 示例 1: 输入:root [1,3,null,null,2] 输出&…

【UWB无线载波通信技术】史上最详细解说!!

UWB定位技术的人员定位系统源码,高精度人员定位系统,自主研发,最高定位精度可达10cm,全套源码合作! 目录 简介 基本原理 技术指标 应用 uwb定位系统应用场景 一、‌室内定位与导航‌: 二、‌特定行业…

如何快速修改CSDN代码块或者主题的字体颜色

第一步登录你的CSDN账号然后点击你的头像 第二步点击下拉框中的“内容管理” 第三步,点击“博客设置” 第四步,点击“等级”选择喜欢的主题和颜色 第五步,选择代码块的主题和颜色 最后保存刷新就可以了。

sqlite数据库设计工具

下载 开发环境 VS2022 + Qt5.14.2 CMake修改 add_subdirectory(sqlite3-cmake) include_directories(${CMAKE_SOURCE_DIR}/sqlite3-cmake/src) target_link_libraries(${PROJECT_NAME} sqlite3) 效果 参考 https://github.com/sqlitebrowser/sqlitebrowser

莱卡相机sd内存卡格式化了怎么恢复数据

在数字化时代,相机已成为我们记录生活、捕捉瞬间的重要设备。而SD内存卡,作为相机的存储媒介,承载着我们的珍贵记忆和重要数据。然而,有时由于误操作、系统错误或其他原因,我们可能会不小心格式化SD内存卡,…

对商品分类系统的若干问题的思考

科学研究的目的就是研究事物的特征,并根据共同的特征加以分类 商品分类是商业,制造业中最普遍的活动,几乎所有的企业,电商平台都要对销售的商品,使用的原材料(BOM)进行分类和编号。 商品分类貌似…

电脑录屏方法,四个方法快速录屏!

在这个数字化时代,无论是教学分享、游戏直播还是软件教程制作,电脑录屏都成了我们日常生活中不可或缺的技能之一。但面对琳琅满目的录屏软件和复杂多样的操作界面,你是否也曾感到一头雾水?别担心,今天我们就来揭秘四个…

攻防世界--->EASYHOOK

做题笔记。 下载 查壳。 32ida打开。 进入main:(该改的该) 动调,第一遍,试试水:看看程序的状态。 运行。 发现我们的输入变成了另一种字符,并且还写了个文件。 我们对,input进行追…

Makefile的常用语法

1. makefile规则 目标:依赖 [tab]命令 或者 目标:依赖 ;命令 【目标】:目标可以是一个文件/标签。可以有多个目标,多个目标之间用空格分开,支持通配符。 【依赖】:依赖可以是一个文件/目标…

【计算机网络】传输层协议UDP

目录 一、端口号1.1 端口号范围划分1.2 认识知名端口号 二、UDP协议2.1 UDP协议端格式2.2 UDP的特点2.3 UDP的缓冲区2.4 UDP使用注意事项2.5 基于UDP的应用层协议 一、端口号 传输层协议负责数据的传输,从发送端到接收端。端口号标识一个主机上进行通信的不同的应用…

力扣之1459.矩形面积

1. 1459.矩形面积 1.1 题干 表: Points ---------------------- | Column Name | Type | ---------------------- | id | int | | x_value | int | | y_value | int | ---------------------- id 是该表中具有唯一值的列。 每个点都用二维坐标 (x_value, y_value) 表示。 编…

化工行业如何做数字化转型?

据红杉的一项调查报告中指出,国内超九成的企业(95%)已经开展了不同程度的数字化实践,并将把数字化转型作为企业的战略核心。数字化转型或者说通过数据手段来帮助企业更好发展的方式,已成为未来不可避免的趋势。 那么&a…

SG-SLAM下载部署安装运行记录

1、论文简介 论文地址 GitHub - silencht/SG-SLAM: SG-SLAM: A Real-Time RGB-D Visual SLAM toward Dynamic Scenes with Semantic and Geometric Information 下载论文,zip文件 2、配置环境 其实没什么好说的,就是按照作者提供的文档 2.1cmake错…

三菱变频器RS-485 端子的接线和构成

RS-485 端子排列 RS-485 端子接线方法 RS-485 的计算机1台、变频器1台时 RS-485 的计算机1台、变频器n台(多台)时 通讯运行的初始设定 1、为使变频器和计算机进行 RS-485 通讯,进行必要的设定。 2、通讯分为使用变频器的PU接口的通讯和使用RS-485端子的通讯。 3、…

【算法题】139. 单词拆分-力扣(LeetCode)

【算法题】139. 单词拆分-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且…

如何下载旧版本app或者旧版本的电脑软件?下载旧版本手机app和电脑软件的方法

下载旧版本软件的方法介绍,下面以下载旧版本剪映为例:

【STM32 Blue Pill编程实例】-手机通过HC-05串口蓝牙控制LED

手机通过HC-05串口蓝牙控制LED 文章目录 手机通过HC-05串口蓝牙控制LED1、HC-05串口蓝牙模块介绍2、硬件准备和接线3、模块配置4、代码实现5、手机控制在本文中,我们介绍如何使用 STM32CubeIDE 和 HAL 库将 HC-05 蓝牙模块与 STM32 Blue Pill 开发板连接。 我们将使用 Android…

分布式事务一致性:本地消息表设计与实践

概念 本地消息表是一种常见的解决分布式事务问题的方法。其核心思想是将分布式事务拆分成本地事务来处理,通过消息队列来保证各个本地事务的最终一致性。 实现步骤 创建本地消息表:在数据库中创建一个本地消息表,用于存储待发送的消息以及消…

泽众P-One性能测试平台火焰图帮助定位产品性能问题

在软件开发过程中,性能问题往往是最头疼的问题之一。随着软件系统的日益复杂,快速准确地定位并解决性能问题变得尤为重要。泽众P-One作为一站式性能测试平台,通过引入火焰图性能分析可视化工具,极大地提升了性能问题的定位效率和解…

PDF样本册如何分享到朋友圈

​想象一下,你刚刚参加了一场行业盛会,获取了一份包含最新行业动态、优秀案例的PDF样本册。你迫不及待地想要分享给身边的朋友,与他们共同学习、探讨。然而,传统的分享方式要么依赖纸质版,要么通过电子邮件&#xff0c…