ios笔记-runtime Method详解

87 篇文章 1 订阅

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值