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 (一)相关推荐

  1. Go 运行时(go runtime)的含义

    go 运行时,也称为 go runtime.其本身就是每个 go 程序的一部分,它会跟你的源码一起编译并连接到目标程序中.即便你只是写了一个 hello world 程序,这个程序中也包含了 runt ...

  2. Deep Learning部署TVM Golang运行时Runtime

    Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...

  3. 使用Runtime执行推理(C++)

    使用Runtime执行推理(C++) 概述 通过MindSpore Lite模型转换后,需在Runtime中完成模型的推理执行流程.本教程介绍如何使用C++接口编写推理代码. Runtime总体使用流 ...

  4. “ compiler-rt”运行时runtime库

    " compiler-rt"运行时runtime库 编译器-rt项目包括: • Builtins-一个简单的库,提供了代码生成和其他运行时runtime组件所需的特定于目标的低级接 ...

  5. runtime系统的Cello

    runtime系统的Cello 通过充当一个现代的.功能强大的runtime系统,Cello使许多以前在C中不切实际或笨拙的事情变得简单,例如: 通用数据结构 多态函数 接口/类型类 构造函数/析构函 ...

  6. 编译器设计-RunTime运行时环境

    编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...

  7. CUDA运行时 Runtime(四)

    CUDA运行时 Runtime(四) 一. 图 图为CUDA中的工作提交提供了一种新的模型.图是一系列操作,如内核启动,由依赖项连接,依赖项与执行分开定义.这允许定义一次图形,然后重复启动.将图的定义 ...

  8. CUDA运行时Runtime(三)

    CUDA运行时Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的存 ...

  9. CUDA运行时 Runtime(二)

    CUDA运行时 Runtime(二) 一. 概述 下面的代码示例是利用共享内存的矩阵乘法的实现.在这个实现中,每个线程块负责计算C的一个方子矩阵C sub,块内的每个线程负责计算Csub的一个元素.如 ...

最新文章

  1. Android零基础入门第81节:Activity数据传递
  2. JavaScript | 声明数组并在每个循环中使用的代码
  3. 360网络自动化运维
  4. python数据挖掘视频_python+opencv实时视频目标检测
  5. AnimMontage(中文)——UE4官方文档翻译与理解
  6. 欧姆龙nj与nx哪个高端_没想到还有比三菱更垃圾的PLC,欧姆龙隆重登场
  7. XZ_Swift 之HealthKit 获取手机计步统计
  8. Pytroch相关操作(1)
  9. 使用Python(OCR)收集体温打卡截图,并自动发消息提醒没交的人。
  10. 5、Shader如何启用SPR Batcher支持
  11. 蒙特卡洛与遗传算法介绍
  12. 【ICML 2020联邦学习论文解读】SCAFFOLD: Stochastic Controlled Averaging for Federated Learning
  13. 如何关闭Windows蜂鸣器的嘟嘟声
  14. 企业wms系统安装在云服务器,wms云服务器配置
  15. 增加平均订单价值 – 交叉销售VS.升级销售
  16. Tuscany SCA软件架构设计理念分析(二)
  17. 指令在Vue.js 2.0中的变化
  18. 开心一笑:关于金融贷款的幽默段子
  19. 数组索引越界异常 ArrayIndexOutOfBoundsException
  20. C++语言入门到精通

热门文章

  1. 6个最热门的IT技术职位,薪资都有多高?
  2. 在linux上ansi格式转换换utf-8格式会乱码吗?,c++对编码格式ANSI utf8 unicode 进行转换...
  3. python几个版本的区别-Python的这几个版本不同
  4. css中的滤镜,CSS中的filter(滤镜)属性
  5. python条形图的动画显示水能时钟_[宜配屋]听图阁
  6. pathinfo函数获取非UTF-8字符集文件名的问题
  7. python中使用PIL模块中的ImageEnhance进行图片数据增强
  8. 吴恩达深度学习1.4笔记_Neural Networks and Deep Learning_深层神经网络
  9. 不学无数——适配器模式
  10. How to Set Up ImpressPages 5.0 on LAMP in CentOS 7.2