gpt4 book ai didi

objective-c - 如何在 Objective-C 中获取方法的函数名?

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:29 24 4
gpt4 key购买 nike

据我所知,一个方法被编译成一个函数是这样的:

+(NSArray *)arrayWithObject:(id)object;
// becomes
NSArray *_c_NSArray_arrayWithObject_(id object);

是否可以获取选择器函数的名称,以便将方法作为参数传递给 C 函数,或者这不可能吗?

最佳答案

不完全是——它们看起来像:

id method(id, SEL, ...); 

因此,Objective-C 方法(无论是类方法还是实例方法)都希望获取调用它的类的实例(如果是类方法,它将是元类)和触发它的选择器.

此类型由 objc.h 定义为“IMP”:

typedef id          (*IMP)(id, SEL, ...); 

您可以通过使用 C 函数 class_getMethodImplementation 来获取 IMP 指针或者使用 +instanceMethodForSelector: (或 -methodForSelector: ,如果你想允许一个特定的实例可能在运行时重新排列它的方法)方法对任何从 NSObject 派生的东西。

所以,例如

#import <objc/objc.h>

id someObject = ...something...;
IMP functionPointerToMethod = [someObject methodForSelector:@selector(method)];

functionPointerToMethod(someObject, @selector(method));

或者:

IMP functionPointerToMethod = [someObject methodForSelector:@selector(method:)];
functionPointerToMethod(someObject, @selector(method:), argument);

甚至:

IMP functionPointerToMethod = class_getMethodImplementation([someObject class],
@selector(method:));

functionPointerToMethod(someObject, @selector(method:), argument);

当然,在所有这一切中,您正在做的是从循环中移除 Objective-C 的正常动态调度。因此,如果您随后在类上添加或重新排列方法,那么您的 C 函数指针将变得过时。

类方法可以通过大致相同的方式访问,但是通过元类,例如

// to do the same as [NSString alloc], not that you ever would...
IMP functionPointerToAlloc = [[NSString class] methodForSelector:@selector(alloc)];
functionPointerToMethod([NSString class], @selector(alloc));

关于objective-c - 如何在 Objective-C 中获取方法的函数名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5137423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com