Runtime学习整理

网上有很多对runtime机制的原理有很多介绍,这里不重复了。这里主要讲讲runtime如何使用,怎么用,我们可以用在哪些场景。

一般我们用Runtime都是想动态的修改或增加原来对象的属性和方法达到自己想要的结果。

那Object-C如何与Runtime进行交互的呢。有如下三种交互方式

1.Objective-C 源代码

比如我们发送这样一个[receiver message],实际上在运行时就会解析成objc_msgSend(id receiver, SEL selector);

2.NSObject类定义的方法(比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector:检查对象能否响应指定的消息;conformsToProtocol:检查对象是否实现了指定协议类的方法;methodForSelector:则返回指定方法实现的地址)

3.对 runtime 函数的直接调用

今天我们着重介绍对Runtime函数的直接调用。

既然要用Runtime的函数,我们就要首先介绍它的常用的API,本质上Runtime就是一系列C语言的API。

1).Class object_setClass(id obj, Class cls)/Class object_getClass(id obj) //更改对象的类/获取对象的类 

- (void) setClassTest

{

NSError *err = [[NSError alloc] init];

Class aClass =object_setClass(err, [NSString class]);

NSLog(@"aClass:%@",NSStringFromClass(aClass));

NSLog(@"obj class:%@",NSStringFromClass([err class]));

}

打印结果:

aClass:NSError

obj class:NSString

可见已经动态改变了err这个对象的类

- (void) getClassTest

{

Class aLogClass =object_getClass(err);

NSLog(@"aLogClass %@",NSStringFromClass(aLogClass));

}

打印结果:aLogClass NSString

2).const char *object_getClassName(id obj) //获取对象的类名

- (void) getClassName

{

NSError *err = [[NSError alloc] init];

NSString *className = [NSString stringWithCString:object_getClassName(err) encoding:NSUTF8StringEncoding];

NSLog(@"className:%@", className);

}

3).Class objc_getClass(const char *name) // 通过名称查找到该类的定义

{

  Class LenderClass = objc_getClass("NSError");

}

4).Class objc_getMetaClass(const char *name) //返回metaclass

关于这个MetaClass,这里着重讲一下

MetaClass是类对象的类。每个对象都有一个metaClass,这个Class主要存储类方法,就是以”+”开头的方法。

当你向一个发送消息时,runtime会在这个类的meta-class的方法列表中查找。

再深入一下,meta-class也是一个类,也可以向它发送一个消息,那么它的isa又是指向什么呢?为了不让这种结构无限延伸下去,Objective-C的设计者让所有的meta-class的isa指向基类的meta-class,以此作为它们的所属类。即,任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己的所属类,而基类的meta-class的isa指针是指向它自己。

借用网上的图表示一下。

红色圈起来的部分可见形成一个完美闭环。

讲到这里估计很多人已经有点晕了,所以这篇先结束,下面再以代码详解。

时间: 2024-10-01 11:25:42

Runtime学习整理的相关文章

ijwmh1-2-以前学习整理出来的学习内容--什么是变量1整型变量

崧闱旭 ijwmh1-2-以前学习整理出来的学习内容--什么是变量1整型变量

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

2017年 1月 15日 指针 学习整理

有关指针的概念: 指针是一个特殊的变量,它里面存储的数值被解释为内存里的一个地址. FIrst of all:我们需要明确目标 关于指针的学习以及使用我们需要搞清楚有关指针的四个内容:指针的类型,指针所指向的类型,指针的值(或者说叫指针所指向的内存区),还有指针本身所占用的内存区(指针也是一个特殊的变量吗,它肯定也是占据内存的).接下来让我们分别进行学习. 我们先来申明几个指针的例子: 1 int *ptr; 2 char *ptr; 3 int **ptr; 4 int (*ptr)[3];

TweenMax学习整理--特有属性

TweenMax学习整理--特有属性 构造函数:TweenMax(target:Object, duration:Number, vars:Object) target:Object -- 需要缓动的对象 duration:Number -- 缓动持续时间 vars:Object -- 其它参数(特有属性29个,插件17个,公共属性10个,公共方法20个) TweenMax提供的方法大多都会返回一个TweenMax Object实例 [特有属性(29个)] 这29个参数可以直接传入第三个obje

linux学习 整理(1)

ls目录文件 uname 现实当前系统信息 clear 清理 history 历史记录 ctrl + R 搜索历史记录 ESC按完之后按. 补齐上次参数 切换root用户 su - 使用管理员权限运行命令 sudo 现实当前用户信息 id 修改当前用户密码 passwd 命令 + & 在后台运行进程 jobs查看后台作业 ctrl + Z 暂停某个程序 bg 控制进程继续在后台运行 fg 控制进程在前台运行 ctrl + C 结束当前命令 linux学习 整理(1),布布扣,bubuko.com

锋利jQuery 学习整理之 第六章 jQuery 与Ajax 的应用

1.Ajax 的XMLHttpRequest 对象 XMLHttpRequest 是Ajax 的核心,它是Ajax 实现的关键---发送异步请求.接受响应及执行回调都是通过它来完成的.XMLHttpRequest最早是在Microsoft Internet Explorer  5.0  ActiveX 组件中被引用的. 2.JQuery 中的Ajax jQuery 对Ajax 进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第二层是load().$.load()和$.post(

HttpClient学习整理

HttpClient简介 HttpClient 功能介绍     1. 读取网页(HTTP/HTTPS)内容     2.使用POST方式提交数据(httpClient3)     3. 处理页面重定向     4. 模拟登录开心网     5. 提交XML格式参数     6. 访问启用认证的页面     7. 多线程模式下使用httpclient httpClient完整封装 HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Ja