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

31 篇文章 0 订阅

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 dosomething];

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

objc_msgSend(obj, @selector (dosomething));

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中。即类方法在元类的方法列表中,对象方法在类方法列表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值