当前位置: 首页 > 编程笔记 >

Objective-C语言直接调用方法

段溪叠
2023-03-14
本文向大家介绍Objective-C语言直接调用方法,包括了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可能会带来更好的性能。

 类似资料:
  • 本文向大家介绍Objective-C语言调用方式,包括了Objective-C语言调用方式的使用技巧和注意事项,需要的朋友参考一下 示例 调用实例方法: 在当前实例上调用实例方法: 调用一个带有参数的方法: 调用类方法:            

  • Objective-C Runtime Runtime 是什么? Runtime 是 Objective-C 区别于 C 语言这样的静态语言的一个非常重要的特性。对于 C 语言,函数的调用会在编译期就已经决定好,在编译完成后直接顺序执行。但是 OC 是一门动态语言,函数调用变成了消息发送,在编译期不能知道要调用哪个函数。所以 Runtime 无非就是去解决如何在运行时期找到调用方法这样的问题。 对

  • 本文向大家介绍Objective-C语言创建基本方法,包括了Objective-C语言创建基本方法的使用技巧和注意事项,需要的朋友参考一下 示例 这是如何创建将“ Hello World”记录到控制台的基本方法: 的-开头表示该方法作为一个实例方法。 该(void)表示的返回类型。此方法不返回任何内容,因此您输入void。 “ hello”是方法的名称。 {}调用方法时,代码中的所有内容都会运行。

  • 本文向大家介绍Objective-C语言创造,包括了Objective-C语言创造的使用技巧和注意事项,需要的朋友参考一下 示例 要么 或使用适当的文字语法            

  • 本文向大家介绍Objective-C语言使用C字符串,包括了Objective-C语言使用C字符串的使用技巧和注意事项,需要的朋友参考一下 示例 转换NSString为const char使用-[NSString UTF8String]: -[NSString cStringUsingEncoding:]如果您的字符串使用非UTF-8编码,则也可以使用。 对于反向路径,请使用-[NSString

  • 本文向大家介绍Objective-C语言XML解析,包括了Objective-C语言XML解析的使用技巧和注意事项,需要的朋友参考一下