您的位置:首页 > 其它

OC_消息机制

2015-12-09 22:46 274 查看

任何数据结构,只要在恰当的位置具有一个指针指向一个class,那么,它都可以被认为是一个对象

在OC中,一个对象所属于哪个类,是由它的isa指针指向的。这个isa指针指向这个对象所属的class

运行原理:

    当向OC对象发送消息时,运行时库会根据对象的isa指针找到这个对象所属的类。这个类会包含一个所有实例方法的列表及一个指向superclass的指针以便可以找到父类的实例方法。运行时库会在类的方法列表以及父类们的方法列表中寻找符合这个selector的方法。找到后即运行这个方法。关键点就是类要定义这个要发送给对象的消息

发送消息机制:

    一个OC的类其实也是一个对象,就是可以向一个类发送消息

    因为每一个OC的类本身也是一个对象。也就是说Class的数据结构必然也是以isa指针开始的在二进制级别上与objc_object是完全兼容的。然后一个类结构的下一个字段一定是一个指向super class的指针(或者指向nil,对于基类来说)

一个类如何定义有很多方法,依赖于你的运行时库版本,但是无论怎样,都是以一个isa作为第一个字段,接着是superclass字段。

     为了可以调用类方法,这个类的isa指针必须指向一个包含这些类方法的类结构体:

 meta-class是一个类对象的类

     当向一个对发送消息时,runtime会在这个对象所属的那个类的方法列表中查找

     当向一个类发送消息时,runtime会在这个类的meta-class的方法列表中查找

     meta-class存储着一个类的所有类方法。每个类都会有一个单独的meta-class,因为每个类的类方法基本不可能完全相同的

meta-class

     meta-class与Class一样,也是一个对象,依旧可以向它发送消息调用函数,自然的,meta-class也会有一个isa指针指向其所属类。所有的基类的meta-class作为他们的所属类。任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己所属的类

     所有的meta-class使用基类的meta-class作为它们的基类,而基类的meta-class也是属于它自己,也就是基类的meta-class的isa指针指向自己。这是一个完美的闭环

类和meta-class的继承

    
4000
与一个类使用super_class指针指向自己的父类一样,meta-class的super_class会指向类的super_class的meta-class。一直追溯到基类的meta-class,它的super_class会指向基类自身(万物归根)

     整个继承体系中的实例、类和meta-class都派生自继承体系中的基类。对于NSObject继承体系来说,NSObject的实例方法对体系中所有的实例、类和meta-class都是有效的。NSObject的类方法对于体系中所有的类和meta-class都是有效的

总结:

     meta-class是类对象的类,每个类都有自己单独的meta-class。所有的类对象并不会属于同一个meta-class。

     meta-class要保证类对象具有继承体系中基类的所有实例和类方法,以及继承体系中的所有中间类方法。对于所有NSObject继承体系下的类,NSObject的实例方法和协议方法对它们和它们meta-class的对象都要有效

     所有的meta-class使用基类的meta-class作为自己的基类,对于顶层基类的meta-class也是一样,只是它指向本身而已

摘自:http://blog.csdn.net/windyitian/article/details/19810875
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  消息机制