Runtime Method 介绍:
Method类型是一个objc_method结构体指针,objc_method有三个成员
typedef struct objc_method Method;
struct objc_method{
SEL method_name; //方法的名称
char *method_typesE;//参数和返回类型的描述字串
IMP method_imp; //方法具体实现的指针
}
// 函数调用,但是不接收返回值类型为结构体
method_invoke
// 函数调用,但是接收返回值类型为结构体
method_invoke_stret
// 获取函数名
method_getName
// 获取函数实现IMP
method_getImplementation
// 获取函数type encoding ,其结果是一串值
method_getTypeEncoding
// 复制返回值类型
method_copyReturnType
// 复制参数类型
method_copyArgumentType
// 获取返回值类型
method_getReturnType
// 获取参数个数
method_getNumberOfArguments
// 获取函数参数类型
method_getArgumentType
// 获取函数描述
method_getDescription
// 设置函数实现IMP
method_setImplementation
// 交换函数的实现IMP
method_exchangeImplementations
小提示:
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[1]
- (void)getAllMethods{
//获取所有方法
unsigned int outCount = 0;
Method *methods = class_copyMethodList([self class], &outCount);
for (int i = 0; i<outCount; i++) {
//1.获取方法
Method method = methods[i];
SEL methodName = method_getName(method);
NSLog(@"方法名:%@",NSStringFromSelector(methodName));
//2.获取方法里的输入参数
unsigned int argCount = method_getNumberOfArguments(method);
char argName[512] = {};
for (int j = 0; j< argCount; j++) {
method_getArgumentType(method, j, argName, 512);
NSLog(@"参数类型:%s",argName);
memset(argName, '\0', strlen(argName));
}
//3.获取方法返回值类型
char retType[512] = {};
method_getReturnType(method, retType, 512);
NSLog(@"返回类型值类型:%s",retType);
//4.输出返回类型输入参数混合编码格式: "返回值类型"+基地址偏移+"@"+基地址偏移+":"+基地址偏移+"输入参数1类型"+基地址偏移+"输入参数2类型"+基地址偏移+....
NSLog(@"返回类型输入参数混合编码:%s",method_getTypeEncoding(method));
}
free(methods);
}
method_invoke的介绍
Method method = class_getInstanceMethod([ViewController class], NSSelectorFromString(@"getAllMethods"));
method_invoke([ViewController class], method);
<===> ((void (*)(id,SEL))objc_msgSend)((id)self,NSSelectorFromString(@"getAllMethods"));
//打印结果
2016-03-25 13:20:11.598 runtimeMethodDemo[1610:187967] 方法名:getAllMethods
2016-03-25 13:20:11.600 runtimeMethodDemo[1610:187967] 参数类型:@
2016-03-25 13:20:11.600 runtimeMethodDemo[1610:187967] 参数类型::
2016-03-25 13:20:11.600 runtimeMethodDemo[1610:187967] 返回类型值类型:v
2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 返回类型输入参数混合编码:v16@0:8
2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 方法名:setVc:
2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 参数类型:@
2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 参数类型::
2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 参数类型:@
2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 返回类型值类型:v
2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 返回类型输入参数混合编码:v24@0:8@16
2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 方法名:noRetNoArg
2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 参数类型:@
2016-03-25 13:20:11.603 runtimeMethodDemo[1610:187967] 参数类型::
2016-03-25 13:20:11.603 runtimeMethodDemo[1610:187967] 返回类型值类型:v
2016-03-25 13:20:11.605 runtimeMethodDemo[1610:187967] 返回类型输入参数混合编码:v16@0:8