如何使用Objective-C中的class_getInstanceMethod调用我保存的方法?

时间:2011-06-20 14:05:53

标签: objective-c methods overloading swizzling

如何使用以下代码调用之前保存的方法:

SEL sel = @selector(someMethod:param:);
Method myMethod = class_getInstanceMethod([SomeClass class], sel);

正如您可能想象的那样,调用[SomeClass someMethod]是行不通的,因为稍后我会调整原始方法。

1 个答案:

答案 0 :(得分:2)

您需要将指针强制转换为正确的函数类型,请记住方法有两个隐式参数self和_cmd。来自Apple的runtime docs

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);

修改

请记住,Method类型是一个结构体,而在ObjC2运行时,它是不透明的,因此您无法直接访问其成员 - 您需要使用method_getImplementation(myMethod)来获取IMP你可以像上面那样进行类型转换。