Objective-C Runtime(2)
来源:互联网 发布:曙光服务器安装linux 编辑:程序博客网 时间:2024/05/11 18:25
上一篇Runtime中介绍了类最终都是以C语言结构体的形式展现,那么C语言中结构体是什么样的有哪些特新和作用呢?
结构体
在C语言中结构体是一种集合,比如包含基础数据类型的int,char ,double等等,可以包含我们想要的数据。结构体也是一种数据类型,我们一颗创建一个结构体,并对其进行修改。结构体本身不占用内存空间,结构体变量占用一块连续的内存空间。
上一篇中我们提到OC的类最终是C语言的结构,而C语言中结构体可以修改。那么我们是不是可以通过修改C语言的结构体,来影响OC中的类呢。
当然Objective-C是允许我们使用C语言来进行开发的。我们已经知道了类的表现,那么类的调用又是什么样的的,这里我们引入消息机制。
消息机制
消息机制,就是在使用某一类的方法的时候我们通过发送消息的形式,而不是通过调用,调用是编译的时候已经确定了你要执行的动作,也是调用确定的方法。确实有点绕,我们明白消息就可以了。
比如我们执行一个Person的方法:
- (void)actionMethod{ NSLog(@"%s", "run");}
Person *teach = [[Person alloc] init];//执行actionMethod方法[teach actionMethod];
Person实例teach 执行actionMethod方法的绑定是通过运行时,那么编译的时候会变成什么,我们来看
编译器会将消息的发送转化成objc_msgSend方法,可以在”objc/message.h”头文件中查看
/* * receiver 消息的发送者 * selector 执行的方法 * arg1 参数1 * arg2 参数2 * ……*/objc_msgSend(receiver, selector, arg1, arg2, …);
[teach actionMethod]在编译的时候:
objc_msgSend(teach, sel_registerName("actionMethod"));
那么objc_msgSend这个方法在什么时候完成动态绑定呢?
1.首先通过receiver(teach类)查找selector(actionMethod)的实现
2.调用该实现,并将一系列参数传递过去(actionMethod没有参数就不传)
3.将该实现的返回值作为自己的返回值,返回(actionMethod没有返回值)
下面我们开看看方法查找的过程,结合之前介绍的结构体
1.通过对象的isa指针找到对应类
2.在objc_cache缓存中去找对应的selector,找到就完成绑定
3.没有找到,在objc_method列表中找,找到就先加入缓存,完成绑定
4.还没有找到,就在super_class的指针指向父类的结构体中查找,直到找到
我们直到完成方法绑定实在运行的时候,那么我们就可以通过Runtime修改方法的实现然后完成绑定。
PS
下一篇中介”objc/runtime.h”库。
- Objective-C Runtime(2)
- 详解Objective-C runtime - 2
- Objective-C Runtime 指南(2)
- Objective-C Runtime 运行时(2)
- Runtime of Objective-C
- Runtime of Objective-C
- objective-c runtime
- Objective-C Runtime
- 详解Objective-C runtime
- 详解Objective-C runtime
- 详解Objective-C runtime
- 详解Objective-C runtime
- objective-c runtime
- 详解Objective-C runtime
- Objective-C Runtime
- 详解Objective-C runtime
- Runtime of Objective-C
- Runtime of Objective-C
- git新建用户
- Java编程思想笔记——第十四章 类型信息
- 基于msm8916移植lcd流程--LK
- linux 安装 composer 提示 "If possible you should enable it or recompile php with --with-openssl"
- arm
- Objective-C Runtime(2)
- mac 终端简单指令
- web 框架 Django 学习记录
- 在3dmax中准备资源
- 非极大值抑制(nonMaximumSuppression)
- 单模多模光纤
- Oracle 11g 针对SQL性能的新特性(三)- SQL Plan Management
- 深入剖析Spring(三)——Bean的生命周期
- 渲染流水线