继上次的研究成果继续深入研究,洒家又完善了下在运行时动态调用所有OC类方法的公用方法:
typedef void*(*ObjcMsgSend)(id, SEL, ...);
- (void *)invoke:(id)inst method:(NSString *)name,...
{
SEL sel = NSSelectorFromString(name);
IMP imp = [inst methodForSelector:sel];
ObjcMsgSend objcMsgSend = (void *)imp;
va_list params;
va_start(params, name);
void *first = va_arg(params, void*);
void *result = objcMsgSend(inst, sel, first, params);
va_end(params);
return result;
}
经过反复测试,此方法目前还有一个使用限制,貌似只能使用于方法返回值为指针或者id类型的方法,如果是返回基本C类型或者结构体等却只能得到指向返回类型的指针的地址值而不能得到返回类型自身的值。说白了,OC的IMP类型貌似不是个模板类型,它不像Java的泛型类型,可以表示任何对象类型!看来还得继续研究下,看看是否能找到一个完美的解决办法!