Objective-C语言直接调用方法
示例
如果需要从C代码调用Objective-C方法,则有两种方法:使用objc_msgSend或获取IMP(方法实现函数指针)并进行调用。
#import <objc/objc.h>
@implementation Example
- (double)negate:(double)value {
return -value;
}
- (double)invert:(double)value {
return 1 / value;
}
@end
//调用对象上的选择器。期望该方法具有一个double参数并返回double。
double performSelectorWithMsgSend(id object, SEL selector, double value) {
//我们声明指向函数的指针,并将objc_msgSend转换为期望的签名。
//警告:这一步很重要!否则,您可能会得到意想不到的结果!
double (*msgSend)(id, SEL, double) = (typeof(msgSend)) &objc_msgSend;
//除了任何显式参数外,还需要传递self和_cmd的隐式参数。
return msgSend(object, selector, value);
}
//与上述功能相同,但通过获取方法的IMP。
double performSelectorWithIMP(id object, SEL selector, double value) {
//获取方法的实现。
IMP imp = class_getMethodImplementation([self class], selector);
//强制转换,以便知道类型,ARC可以正常工作。
double (*callableImp)(id, SEL, double) = (typeof(callableImp)) imp;
//同样,您需要显式参数。
return callableImp(object, selector, value);
}
int main() {
Example *e = [Example new];
//调用否定,结果为-4
double x = performSelectorWithMsgSend(e, @selector(negate:), 4);
//调用反转,结果为0.25
double y = performSelectorWithIMP(e, @selector(invert:), 4);
}objc_msgSend通过获取该方法的IMP并对其进行调用来工作。IMP最后调用的几种方法的s被缓存,因此,如果在非常紧密的循环中发送Objective-C消息,则可以获得可接受的性能。在某些情况下,尽管这是最后的优化方法,但是手动缓存IMP可能会带来更好的性能。
热门推荐
1 如何训练狗狗不叫
2 训练狗狗不叫
3 训练狗狗随行
4 怎么训练狗狗不叫
7 训练比熊狗狗教程
10 上海狗狗训练
11 怎么训练狗狗上厕所
12 训练狗狗趴下
13 狗狗服从训练
14 训练狗狗拒食
15 训练狗狗笑
16 训练狗狗大便
17 训练狗狗立
18 训练狗狗捡东西