初涉Runtime (一)
Objective-C 是一门动态语言,有很多东西都是运行时才确定的。
比如这句代码首先声明testObject是一个NSString,然后创建了一个NSData对象,并且将这个对象的内存地址保存在test Object中。运行的时候textObject只想的就是一个NSData对象。
NSString *testObject = [[NSData alloc]]init];
Runtime,是一套运行机制。是拿C语言一套比较底层的API,里面于很多很好很强大的方法。我们平写的OC的代码转成Runtime进行实现。就像我们初始化一个对象的时候
OC :[[Person alloc] init]runtime :objc_msgSend(objc_msgSend("Person" , "alloc"), "init")还有我们调用方法的时候,是这个样子的OC:[object method]Runtime:object_msgSend(obj,@selector(method));
既然Runtime是属于OC的底层,name他就可以进行一些比较底层的操作。Objective-C能做的事情他能做,runtime能做的事情object-C就不一定能做到了,比如我们可以在程序运行的时候添加一个类,遍历一个类的成员,或者为某一个类添加一个属性,修改属性值之类的操作。
下面我们就举个例子用Runtime遍历模型属性,对属性进行归档结档操作。
第一步我们需要倒入相关的头文件,运行时相关的头文件一般都存放在头文件的/objc中,比较常用的<objc/runtime.h>,<objc/message>。
1. 可以先做一个测试,我在控制器的viewDidLoad里面写了一段代码,
- (void)viewDidLoad {[super viewDidLoad];unsigned int count = 0;Ivar *ivars = class_copyIvarList([SQKPerson class], &count);for (int i = 0; i<count; i++) {// 取出i位置对应的成员变量Ivar ivar = ivars[i];// 查看成员变量const char *name = ivar_getName(ivar);NSLog(@"%s", name);}
打印的结果是
2015-10-28 22:47:41.186 runtime[2312:108141] _age 2015-10-28 22:47:41.186 runtime[2312:108141] _height 2015-10-28 22:47:41.186 runtime[2312:108141] _name
3. 创建一个Person的类,声明了三个属性,age,height,name。
// // SQKPerson.m // runtime // // Created by SQK on 15/10/28. // Copyright © 2015年 SQK. All rights reserved. // #import "SQKPerson.h" #import <objc/runtime.h>/*** 进行归档接档,需要遵守NSCoding协议*/ @interface SQKPerson ()<NSCoding> //在这里声明了属性 @property (nonatomic, assign) int age; @property (nonatomic, assign) int height; @property (nonatomic, copy) NSString *name;@end@implementation SQKPerson- (void)encodeWithCoder:(NSCoder *)encode {unsigned int count = 0;Ivar *ivars = class_copyIvarList([SQKPerson class], &count);for (int i = 0; i<count; i++) {//获取Ivars成员变量Ivar ivar = ivars[i];//需要将name转成URTF8类型的const char *name = ivar_getName(ivar);NSString *key = [NSString stringWithUTF8String:name];//归档id value = [self valueForKey:key];[encode encodeObject:value forKey:key];}//需要管理内存 free(ivars); }-(instancetype)initWithCoder:(NSCoder *)decoder{if (self= [super init]) {unsigned int count = 0;Ivar *ivars = class_copyIvarList([SQKPerson class], &count);for (int i = 0; i<count; i++) {//取出对应的成员变量Ivar ivar = ivars[i];const char *name = ivar_getName(ivar);//结档NSString *key = [NSString stringWithUTF8String:name];//通过key取到成员变量(kvc)id value = [decoder decodeObjectForKey:key];//设置value到成员变量身上 [self setValue:value forKey:key];}free(ivars);}return self; }@end
如果我们模型中的属性很多的话,那么用这种方法进行操作是很方便的。
总之,runtime是很强大的一套语言库。在苹果的官方文档中也给出了详细的文档,对各种进行详细的解释
class_getName
class_addIvar
class_copyIvarList
class_getProperty
class_getPropertyList
....................
总而言之,Runtime是很好的一套东西,希望我们都能对他有所了解。我写这东西也是一边学一边写,难免避免有错误的见解。希望能和大家共同进步!
转载于:https://www.cnblogs.com/suqiankun/p/4919023.html
初涉Runtime (一)相关推荐
- Go 运行时(go runtime)的含义
go 运行时,也称为 go runtime.其本身就是每个 go 程序的一部分,它会跟你的源码一起编译并连接到目标程序中.即便你只是写了一个 hello world 程序,这个程序中也包含了 runt ...
- Deep Learning部署TVM Golang运行时Runtime
Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...
- 使用Runtime执行推理(C++)
使用Runtime执行推理(C++) 概述 通过MindSpore Lite模型转换后,需在Runtime中完成模型的推理执行流程.本教程介绍如何使用C++接口编写推理代码. Runtime总体使用流 ...
- “ compiler-rt”运行时runtime库
" compiler-rt"运行时runtime库 编译器-rt项目包括: • Builtins-一个简单的库,提供了代码生成和其他运行时runtime组件所需的特定于目标的低级接 ...
- runtime系统的Cello
runtime系统的Cello 通过充当一个现代的.功能强大的runtime系统,Cello使许多以前在C中不切实际或笨拙的事情变得简单,例如: 通用数据结构 多态函数 接口/类型类 构造函数/析构函 ...
- 编译器设计-RunTime运行时环境
编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...
- CUDA运行时 Runtime(四)
CUDA运行时 Runtime(四) 一. 图 图为CUDA中的工作提交提供了一种新的模型.图是一系列操作,如内核启动,由依赖项连接,依赖项与执行分开定义.这允许定义一次图形,然后重复启动.将图的定义 ...
- CUDA运行时Runtime(三)
CUDA运行时Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的存 ...
- CUDA运行时 Runtime(二)
CUDA运行时 Runtime(二) 一. 概述 下面的代码示例是利用共享内存的矩阵乘法的实现.在这个实现中,每个线程块负责计算C的一个方子矩阵C sub,块内的每个线程负责计算Csub的一个元素.如 ...
最新文章
- Android零基础入门第81节:Activity数据传递
- JavaScript | 声明数组并在每个循环中使用的代码
- 360网络自动化运维
- python数据挖掘视频_python+opencv实时视频目标检测
- AnimMontage(中文)——UE4官方文档翻译与理解
- 欧姆龙nj与nx哪个高端_没想到还有比三菱更垃圾的PLC,欧姆龙隆重登场
- XZ_Swift 之HealthKit 获取手机计步统计
- Pytroch相关操作(1)
- 使用Python(OCR)收集体温打卡截图,并自动发消息提醒没交的人。
- 5、Shader如何启用SPR Batcher支持
- 蒙特卡洛与遗传算法介绍
- 【ICML 2020联邦学习论文解读】SCAFFOLD: Stochastic Controlled Averaging for Federated Learning
- 如何关闭Windows蜂鸣器的嘟嘟声
- 企业wms系统安装在云服务器,wms云服务器配置
- 增加平均订单价值 – 交叉销售VS.升级销售
- Tuscany SCA软件架构设计理念分析(二)
- 指令在Vue.js 2.0中的变化
- 开心一笑:关于金融贷款的幽默段子
- 数组索引越界异常 ArrayIndexOutOfBoundsException
- C++语言入门到精通
热门文章
- 6个最热门的IT技术职位,薪资都有多高?
- 在linux上ansi格式转换换utf-8格式会乱码吗?,c++对编码格式ANSI utf8 unicode 进行转换...
- python几个版本的区别-Python的这几个版本不同
- css中的滤镜,CSS中的filter(滤镜)属性
- python条形图的动画显示水能时钟_[宜配屋]听图阁
- pathinfo函数获取非UTF-8字符集文件名的问题
- python中使用PIL模块中的ImageEnhance进行图片数据增强
- 吴恩达深度学习1.4笔记_Neural Networks and Deep Learning_深层神经网络
- 不学无数——适配器模式
- How to Set Up ImpressPages 5.0 on LAMP in CentOS 7.2