Runtime,元类,isa指针的概念及联系

1.Runtime是什么

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。(摘自:http://www.cocoachina.com/ios/20141031/10105.html)

Objective-C(下面简称OC)是对C语言的封装,Runtime是OC在封装C时的一个产物。Runtime简单说就是一套C语言API,OC的所有代码在编译时最终会转化成直接执行Runtime中API的代码。

当我们在OC中调用一个方法如:

[obj dosome]

会被转化为Runtime中的可执行的的方法

objc_msgSend(obj, @selector (dosome));

2.元类

元类是类对象的类。听起来很拗口。

我们知道,一个类可以定义一个实例对象。举例

ClassObject *instanceObject=[[ClassObject alloc] init];

此处ClassObject就是一个类,instanceObject就是一个实例对象。

而在OC中,每当我们创建一个类,在编译时就会创建一个元类,而这个元类的对象就是我们创建的这个类。

3.isa指针

我们知道OC是基于C语言的,所有OC语法最后Runtime转化成可被Runtime执行的C代码。在OC中定义一个创建NSObject类,转化成C语言后,其表现是创建了一个结构体。可以在Xcode中点击alt+NSObject查看该结构。

NSObject转化成C后的样子

其中isa就是这个结构中的一个指针。这个指针指向他的类。如果是实例对象,则指向类,如果是类,则isa指类的类,也就是元类(meta class)。而元类则指向另一个基类的元类。

我们创建一个实例对象,在C中

struct objc_object {

Class isa  OBJC_ISA_AVAILABILITY;

};

此处的isa指针指向其类地址。下图说明了元类,类及对象的isa指向

对象,类,元类关系图

4.关系

讲了Runtime,isa,元类等概念最终是为了说明白一个OC的方法,是最终如何通过runtime执行的。如下

Person:NSObject{

+(void)eat;

-(void)make;

}

[Person eat]

Person *onePerson=[[Person alloc]init]

此时有结构如下图

Person关系图


Person执行eat方法,runtime将其转化为OC函数

objc_msgSend(Person, @selector (makeText))

首先会从Person结构中寻找,如果Person结构的方法列表中寻找eat,有则执行,否则则会根据isa地址去去Person元类中寻找。如果Person元类中没有则根据isa再去基元类中找。此处eat方法在person元类中,make方法在Person中。即类方法在元类的方法列表中,对象方法在类方法列表中。

第一次写,错误之处请指出

交流微信


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.Runtime是什么 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运...
    biyuhuaping阅读 102评论 0 1
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,732评论 7 64
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,762评论 0 9
  • 已下大部分内容参考于:Objective-C Runtime杨萧玉的博客 Objective-C Runtime深...
    dyouknow阅读 577评论 0 2
  • 工作原因和外国友人有些接触。 就在昨天,加拿大的同事在朋友圈感慨,“中国如此高的效率真的令人印象深刻,刚耳闻有一条...
    素年锦时_Jamie阅读 59评论 0 0