iOS runtime学习笔记

一、对象 id

1,id是指向objc_object结构体的指针变量,objc_object结构体中首个成员是Class类的变量:Class isa;该变量定义了对象所属的类。而Class所指向的objc_class结构体中的首个成员也是isa变量,还包括其他成员,则Class本身可以说是继承自objc_object,所以id可以指向所有OC的对象。

二、类对象

1,由于Class本身也是OC的对象,则称之为类对象,类对象的结构体中包含了本类的一些成员,包括元类的指针,父类的指针,类名,所占内存空间,版本,信息,实例变量表,实例方法表的指针,方法缓存,协议表。实例对象可以通过isa指针找到本类的实例变量以及实例方法和协议进行调用。

三、元类

1,类对象中的isa指向他的元类,类对象可以说是元类的实例,在内存中元类只会生成一个类对象的实例,而元类中的结构与类对象的结构是一样的,不过元类的isa指向根元类(NSObject的元类),元类的super_class指向根类对象(NSObject),根元类的isa指向它自己。元类中保存着static声明的静态变量与类方法。

四、消息传递与消息转发

1,对象调用方法,在OC中会转换成objc_msgSend(id,SEL,...)函数调用,通过对象的isa指针找到所属的类对象,通过SEL在类对象的实例方法列表中找到对应的方法,如果找不到,通过类对象的super_class指针找到父类,在父类方法表中继续查找,一层一层向上传递,直到根类。根据方法返回值的不同还会转换成不同的函数调用:objc_msgSend_stret()反回结构体,objc_msgSend_fpret()返回浮点数,objc_msgSendSuper()给父类发消息,父类也有以上两种。

2,消息转发,如果一个对象没有实现某个方法,在调用此方法时会进入消息转发流程,如果实现了消息转发接口,则可以在消息转发中控制方法的传递,改变接受消息的对象或实现方法。直接上图


五、方法交换

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,905评论 0 9
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,817评论 33 466
  • 前言 runtime其实在我们日常开发过程中很少使用到,尤其是像我现在比较初级的程序猿就更用不到了。但是去面试很多...
    WolfTin阅读 4,134评论 0 2
  • 参考链接: http://www.cnblogs.com/ioshe/p/5489086.html 简介 Runt...
    乐乐的简书阅读 6,521评论 0 9
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 5,373评论 0 8

友情链接更多精彩内容