类中定义的方法通常是以函数形式实现的,但通常在编程的时候并不会直接操作方法对应对函数。
如果想让程序更快一点,可以通过函数指针的方式调用方法。(提升了速度,但失去了面向对象的动态绑定、多态的特性)
IMP 类型
IMP是“implementation”的缩写,是一个函数指针,指向了方法实现代码的入口。
IMP定义为
typedef id (*IMP)(id,SEL,..);
获得函数指针的方法
- (IMP)methodForSelector: (SEL) aSelector
搜索和指定选择器对应的方法,并返回指向方法实现的指针。实例对象和类对象都可以使用这个方法。
+ (IMP)instanceMethodForSelector: (SEL)aSelector
搜索和指定选择器对应的实例方法,并返回指向方法实现的指针。
用法
设有以下一个方法
- (id)setBox: (id)obj1 title: (id)obj2;
我们通过以下代码实现调用
IMP funcp;
//设foo为实例变量,函数调用方法为[fool setBox:obj1 title:obj2]; ,但下处使用foo的实例方法返回函数指针从而调用函数setBox: title
funcp = [foo methodForSelector:@selector (setBox:title:)];
xyz = (*funcp)(foo,@selector(setBox:title:),param1,param2);
从以上代码可知,通过函数指针调用的方式其实含有两个 隐含参数 。 第一个为self,第二个为选择器(可以通过_cmd变量来访问)。
内容引自《Objective-C编程全解》- [日]
网友评论