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 = ;
Ivar *ivars = class_copyIvarList([SQKPerson class], &count); for (int i = ; i<count; i++) {
// 取出i位置对应的成员变量
Ivar ivar = ivars[i]; // 查看成员变量
const char *name = ivar_getName(ivar);
NSLog(@"%s", name);
}

打印的结果是

-- ::41.186 runtime[:] _age
-- ::41.186 runtime[:] _height
-- ::41.186 runtime[:] _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 = ; Ivar *ivars = class_copyIvarList([SQKPerson class], &count); for (int i = ; 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 = ;
Ivar *ivars = class_copyIvarList([SQKPerson class], &count); for (int i = ; 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是很好的一套东西,希望我们都能对他有所了解。我写这东西也是一边学一边写,难免避免有错误的见解。希望能和大家共同进步!

初涉Runtime (一)的更多相关文章

  1. runtime梳理。

    一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...

  2. myeclipse 无法启动 java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).

    把myeclipse10 按照目录完整拷贝到了另外一台电脑, 另外的目录 原安装目录 D\:\soft\i\myeclipse10 新安装目录 E\:\soft\myeclipse10 双击启动失败, ...

  3. Objective-C runtime初识

    Objective-C Runtime Describes the macOS Objective-C runtime library support functions and data struc ...

  4. Objective-C runtime的常见应用

    用Objective-C等面向对象语言编程时,"对象"(object)就是"基本构造单元"(building block).开发者可以通过对象来存储并传递数据. ...

  5. Runtime应用防止按钮连续点击 (转)

    好久之前就看到过使用Runtime解决按钮的连续点击的问题,一直觉得没啥好记录的.刚好今天旁边同时碰到这个问题,看他们好捉急而且好像很难处理,于是我先自己看看… 前面自己也学习了很多Runtime的东 ...

  6. iOS开发-- 通过runtime kvc 移除导航栏下方的阴影效果线条

    网上查了很多, 都是重新绘制, 感觉有点蠢, 恰巧工作有会闲, 就简单的通过runtime遍历了下属性找寻了下私有类和方法, 这里直接贴方法, 找寻过程也发出来, 能看懂的直接就能看懂, 看不太明白的 ...

  7. VS2015 出现 .NETSystem.Runtime.Remoting.RemotingException: TCP 错误

    错误内容: 界面显示内容为: .NET�������������System.Runtime.Remoting.RemotingException: TCP 淇¢亾鍗忚鍐茬獊: 搴斾负鎶ュご銆� 鍦 ...

  8. DirectX runtime

    DirectX 9.0 runtime etc https://www.microsoft.com/en-us/download/details.aspx?id=7087 DirectX 11 run ...

  9. runtime

    7.runtime实现的机制是什么,怎么用,一般用于干嘛. 你还能记得你所使用的相关的头文件或者某些方法的名称吗? 运行时机制,runtime库里面包含了跟类.成员变量.方法相关的API,比如获取类里 ...

随机推荐

  1. 新学一招,使用热门的Git

    1.安装Git 1.本文所用版本为Git-1.8.0-preview20121022.exe  , http://msysgit.googlecode.com/files/Git-1.8.0-prev ...

  2. 01——微信小程序官方demo讲解——文件结构

    1.环境概览 首先环境配置的部分略过,打开小程序开发工具.选择一个空目录,即可开始一个demo项目. 其中新建成功后的目录如图所示: 2.文件结构描述 如图所示,左边是界面展示,右边是目录结构. 目录 ...

  3. CDN之多边缘节点负载均衡--学习笔记

    一.剧情 剧情是这样的,本次的多边缘节点负载均衡实验,1个LVS四层负载均衡集群和1个Nginx为反向代理的七层负载均衡集群,由Bind dns解析作为 主负载均衡服务器,调度两个集群,中间层有一台W ...

  4. [ Python ] Flask 基于 Web开发 大型程序的结构实例解析

    作为一个编程入门新手,Flask是我接触到的第一个Web框架.想要深入学习,就从<FlaskWeb开发:基于Python的Web应用开发实战>这本书入手,本书由于是翻译过来的中文版,理解起 ...

  5. django的实现异步机制celery

    celery 一句话总结:celery是一种实现异步的机制,对于比较耗时的任务可以使用其来减少客户端等待时间(注册邮箱验证),提高用户体验. 官方网站 中文文档 示例一:用户发起request,并等待 ...

  6. 论XGBOOST科学调参

    XGBOOST的威力不用赘述,反正我是离不开它了. 具体XGBOOST的原理可以参见之前的文章<比XGBOOST更快--LightGBM介绍> 今天说下如何调参. bias-varianc ...

  7. Linux安装MariaDB+初始化数据库

    背景说明: 在数据库中,mysql的是常用的数据库之一:作为一款开源的软件被广大公司所使用. 但是,mysql在被Oracle公司收购后,难免在以后会有取消开源的问题.所以急需一款新的数据库产品替换m ...

  8. Core1.1环境下,自己实现的一个简单的CRUD框架(反射实现)

    我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...

  9. ios开发中view.layer.shouldRasterize = YES 的使用说明

    在做一个NavigationController push 子页面时,发现push和pop时很卡,研究了一大阵子后,发现在子页面里影响UI流畅的只有UIImageView的圆角设置:然后我就关闭了圆角 ...

  10. 分别用js和css实现瀑布流

    下午查找了瀑布流的相关原理,找了一些css3实现的还有js实现的,最后总结了一些比较简单的,易懂的整理起来 1.css3实现 只要运用到    column-count分列 column-width固 ...