Objc Class And Metaclass(Objective-C类和原类)

    Objective-C是基于类的面向对象语言。每个对象都是某个类的一个实例对象;对象的isa指针指向了对象对应的类。类描述了对象的数据:内存分配大小和变量(ivar)类型和布局。类也描述了对象的行为:类能够响应的选择器(selectors按字面翻译是因为selector并不是方法的具体实现的起始地址而是作为一个key对应存放着方法的起始地址)和类实现的具体方法。

    类的方法列表是方法实例、对象能够响应的选择器的集合。当你发送一个方法给一个实例对象的时候,objc_msgSend()查询对象对应的类的方法列表(如果有超类的话,也查询超类的方法列表)来决定具体调用哪个方法。

    每一个Objective-C类也是一个对象。他也有一个isa指针和其他的数据,和可以相应的选择器。当你调用一个“类方法的时候”例如[NSObject alloc],确实是给类对象(不是类的实例对象)发送了一个消息。

    既然类也是一个对象,它一定也是一个其他类的实例:原类。原类是类对象的描述,就像是类是原始实例对象的描述一样。特别是,原类的方法列表是类的方法:类对象可以相应的选择器。当你发送一个消息给一个类-原类的实例- objc_msgSend()查询原类的方法列表(如果有超类的话,也查询超类的方法列表)来决定具体调用什么方法。类方法是由代表类对象的原类来描述的。就像对象实例方法是由代表实例对象的类来描述的一样。

    那原类呢?原类就是最深层的实现吗?不是的,原类是root类的原类的实例;root原类是它自身的一个实例。这个isa传递就在这终结:对象实例—类—原类—root原类—root原类自身。原类的isa指针的行为是没有多大关系的,一般很少有人给原类对象发送消息的。

更重要的是原类的超类。原类的超类链是和类的超类链并行的,所以类方法也是和实例方法并行的。Root原类的超类是root类,所以每个类对象可以相应root类实例的方法。最后,类对象是root类(或者是子类)的实例,就像任何其他对象一样。

    迷糊了么?下面的图将帮你理解。记住,当一个消息被发送到任何对象的时候,方法查询是从对象的isa指针开始的,然后从超类链继续查询。“实例方法”是由类定义的,“类方法”是由原类加上root类(非原)定义的。

    在恰当的计算机科学语言理论中,类和原类的层次结构是可以更加自由的,有更深的原类链和从任何简单的原类实例化出多个类。Objective-C为了实际目标像类方法一样使用原类,但是又要隐藏原类。例如,[NSObject class]是和[NSObject self]相等的,虽然形式上它应该返回NSObject->isa指向的原类。Objective-C语言是一个折中的集合;在获得too、well、meta之前限制了类的架构。


原文链接:http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值