OC-Runtime

Cocoa 中大多数类都继承于NSObject类,也就自然继承了它的方法。最特殊的例外是NSProxy,它是个抽象超类,它实现了一些消息转发有关的方法,可以通过继承它来实现一个其他类的替身类或是虚拟出一个不存在的类,说白了就是领导把自己展现给大家风光无限,但是把活儿都交给幕后小弟去干。

有的NSObject中的方法起到了抽象接口的作用,比如description方法需要你重载它并为你定义的类提供描述内容。NSObject还有些方法能在运行时获得类的信息,并检查一些特性.比如:
class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;
respondsToSelector:检查对象能否响应指定的消息;
conformsToProtocol:检查对象是否实现了指定协议类的方法;
methodForSelector:则返回指定方法实现的地址。
OC是一种消息语言,传递消息的形式为【reciver message】,只有再运行时,运行环境才会将消息与方法的实现绑定在一起,也就是调用objc_msgSend函数,实现的过程大致为:
1.首先检测selector是不是要忽略的函数。
2.检测消息的接受者是不是nil对象,应为OC中nil对象可以接受任何方法而不会被Crash掉,应为会被做忽略处理。
3.如果上面两条都检查完毕,就找这个函数的IMP表,首先从cache里面找,如果有就直接执行相对应的函数。
4.如果没有找到,就找下一张函数分发表。
5.如果还是找不到,就继续找超类的函数分发表,一直找到NSObject类
6.如果还是找不到就要到动态方法解析,或者直接崩溃掉

你可能感兴趣的:(oc)