Objective-C Runtime III【objc_msgSend函数】
2012-06-14 10:38
197 查看
objc_msgSend函数
关于Selector,什么 是Selector,Selector就是一个字符串,用来表示一个方法。在Objective-C中,消息是直到运行的时候才和方法实现绑定的。编译器会把一个消息表达式,
[receiver message] |
objc_msgSend的调用。该函数有两个主要参数:消息接收者和消息对应的方法名字——也就是方法选标:
objc_msgSend(receiver, selector) |
objc_msgSend(receiver, selector, arg1, arg2, ...) |
它首先找到选标所对应的方法实现。因为不同的类对同一方法可能会有不同的实现,所以找到的方法实现依赖于消息接收者的类型。
然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传给找到的方法实现。
最后,将方法实现的返回值作为该函数的返回值返回。
注意:编译器将自动插入调用该消息函数的代码。您无须在代码中显示调用该消息函数。
消息机制的关键在于编译器为类和对象生成的结构。每个类的结构中至少包括两个基本元素:
指向父类的指针。
类的方法表。方法表将方法选标和该类的方法实现的地址关联起来。例如,
setOrigin::的方法选标和
setOrigin::的方法实现的地址关联,
display的方法选标和
display的方法实现的地址关联,等等。
当新的对象被创建时,其内存同时被分配,实例变量也同时被初始化。对象的第一个实例变量是一个指向该对象的类结构的指针,叫做
isa。通过该指针,对象可以访问它对应的类以及相应的父类。
注意:尽管严格来说这并不是Obective-C语言的一部分,但是在Objective-C运行时系统中对象需要有
isa指针。对象和结构体
struct objc_object(在
objc/objc.h中定义)必须“一致”。然而,您很少需要创建您自己的根对象,因为从
NSObject或者
NSProxy继承的对象都自动包括
isa变量。
类和对象的结构如图 3-1所示。
图 3-1 消息框架
当对象收到消息时,消息函数首先根据该对象的
isa指针找到该对象所对应的类的方法表,并从表中寻找该消息对应的方法选标。如果找不到,
objc_msgSend将继续从父类中寻找,直到
NSObject类。一旦找到了方法选标,
objc_msgSend则以消息接收者对象为参数调用,调用该选标对应的方法实现。
这就是在运行时系统中选择方法实现的方式。在面向对象编程中,一般称作方法和消息动态绑定的过程。
为了加快消息的处理过程,运行时系统通常会将使用过的方法选标和方法实现的地址放入缓存中。每个类都有一个独立的缓存,同时包括继承的方法和在该类中定义的方法。消息函数会首先检查消息接收者对象对应的类的缓存(理论上,如果一个方法被使用过一次,那么它很可能被再次使用)。如果在缓存中已经有了需要的方法选标,则消息仅仅比函数调用慢一点点。如果程序运行了足够长的时间,几乎每个消息都能在缓存中找到方法实现。程序运行时,缓存也将随着新的消息的增加而增加。
相关文章推荐
- Objective-C Runtime 【objc_msgSend函数】
- Objective-C Runtime分析(三)-objc_msgSend
- 《Objective-C Runtime分析(三)-objc_msgSend》
- Objective-C Runtime Programming Guide 笔记02 objc_msgSend Function
- Runtime之objc_msgSend函数
- 【Objective-C Runtime动态加载】---动态创建类Class 动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法 a.使用objc_
- 理解 Objective-C Runtime
- Objective-C Runtime 运行时之六:拾遗
- Objective-C总Runtime的那点事儿(一)消息机制
- Objective-C 中的Runtime的使用
- Objective-C Runtime能做什么?
- Objective-C Runtime
- Objective-C Runtime 运行时之三:方法与消息
- Objective-C Runtime 运行时之四:Method Swizzling
- Objective-C runtime之消息转发机制(三)
- Objective-C Runtime 运行时之一:类与对象
- Objective-C RunTime机制(1)
- Understanding the Objective-C Runtime
- Objective-C Runtime 运行时之二:成员变量与属性
- Objective-C Runtime 成员变量与属性