【发送消息 vs 调用函数】
在Objective-C中,发送消息最终会被转化为函数调用,避免动态绑定的唯一办法就是取得方法的地址,并且直接象函数调用一样调用它。当一个方法会被连续调用很多次,而且您希望节省每次调用方法都要发送消息的开销时,使用方法地址来调用方法就显得很有效。
利用NSObject 类中的methodForSelector: 方法,您可以获得一个指向方法实现的指针,并可以使用该指针直接调用方法实现。methodForSelector: 返回的指针和赋值的变量类型必须完全一致,包括方法的参数类型和返回值类型都在类型识别的考虑范围中。
下面的例子展示了怎么使用指针来调用setFilled: 的方法实现:
void (*setter)(id, SEL, BOOL);
|
int i;
|
|
setter = (void (*)(id, SEL, BOOL))[target
|
methodForSelector:@selector(setFilled:)];
|
for ( i = 0; i < 1000, i++ )
|
setter(targetList[i], @selector(setFilled:), YES);
|
方法指针的第一个参数是接收消息的对象(self ),第二个参数是方法选标(_cmd )。这两个参数在方法中是隐藏参数,但使用函数的形式来调用方法时必须显示的给出。
使用methodForSelector: 来避免动态绑定将减少大部分消息的开销,但是这只有在指定的消息被重复发送很多次时才有意义,例如上面的for 循环。
注意,methodForSelector: 是Cocoa运行时系统的提供的功能,而不是Objective-C语言本身的功能。
|
请发表评论