iOS Runtime《三》Method 和 SEL

发布时间:2021-10-25 08:39:18

1、objc_method_description 结构体


struct objc_method_description {
SEL _Nullable name; /**< The name of the method */
char * _Nullable types; /**< The types of the method arguments */
};

name:函数名称?


types:函数的参数返回值的类型。


2、method_getDescription :获得objc_method_description 结构体的信息


OBJC_EXPORT struct objc_method_description * _Nonnull
method_getDescription(Method _Nonnull m)
OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

过传入Method返回objc_method_description: 除了这个objc_method_description结构体,我们还要了解2个概念,SELIMP: SEL:函数的选择器,一般用函数名进行绑定。 IMP:函数的地址,用过这个可以执行函数


3、SEL 和字符相互转换


//1、转字符
OBJC_EXPORT const char * _Nonnull sel_getName(SEL _Nonnull sel)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

//2、转SEL
OBJC_EXPORT SEL _Nonnull sel_registerName(const char * _Nonnull str)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

例:打印Method的信息


-(void)getMethodDescription:(Method)method
{
if (!method) {
return;
}

struct objc_method_description *des=method_getDescription(method);

SEL sel=des->name;
char *type=des->types;

NSLog(@"sel_getName=%s type=%s",sel_getName(sel),type);

}

4、获取实例方法和获取类方法


// 1、获取 实例方法(只有方法实现才能找到)
OBJC_EXPORT Method _Nullable
class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

//2、获取 对象方法(只有方法实现才能找到)
OBJC_EXPORT Method _Nullable
class_getClassMethod(Class _Nullable cls, SEL _Nonnull name)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

备注:没有实现的方法是找不到的,只有实现的方法才能找到,另外,我们发现找类方法时候传入的cls是通过objc_getMetaClass这个方法获得的,为什么?,类方法是存在元类对象里面,而实例方法是存在类对象里面。


只声明方法,但是不实现Method就会为null


例:新建一个Dog类 ,添加两个实例方法 和两个类方法,分别实现其中一个实例方法和其中一个类方法


//Dog .h
#import

NS_ASSUME_NONNULL_BEGIN

@interface Dog : NSObject

//实例方法
-(void)running;
-(void)fight;

//对象方法
+(void)eat;
+(void)sleep;
@end

NS_ASSUME_NONNULL_END

Dog.m
#import "Dog.h"

@implementation Dog
-(void)running
{
NSLog(@"狗实例方法跑步%s",__func__);
}

+(void)eat
{
NSLog(@"狗类方法吃东西%s",__func__);
}
@end



//获取实例方法
//已实现实例方法
SEL selector=sel_registerName("running");
Method method=class_getInstanceMethod(objc_getClass("Dog"), selector);
[self getMethodDescription:method];//已实现 返回running

//没有实现实例方法
SEL selector1=sel_registerName("fight");
Method method1=class_getInstanceMethod(objc_getClass("Dog"), selector1); //method1=nil
[self getMethodDescription:method1];// method=nil

//类方法
//已实现类方法
SEL selector2=sel_registerName("eat");
Method method2=class_getClassMethod(objc_getMetaClass("Dog"), selector2);
[self getMethodDescription:method2];//已实现 返回eat

//未实现类方法
SEL selector3=sel_registerName("sleep");
Method method3=class_getClassMethod(objc_getMetaClass("Dog"), selector3);// method=nil
[self getMethodDescription:method3];//method1=nil

//打印信息
2019-03-13 11:25:15.152067+0800 SSS[656:60417] sel_getName=running type=v16@0:8
2019-03-13 11:25:15.152345+0800 SSS[656:60417] method==nil
2019-03-13 11:25:15.152472+0800 SSS[656:60417] sel_getName=eat type=v16@0:8
2019-03-13 11:25:15.152630+0800 SSS[656:60417] method==nil

5、获取类的实例对象列表或者元类对象的类方法列表


OBJC_EXPORT Method _Nonnull * _Nullable
class_copyMethodList(Class _Nullable cls, unsigned int * _Nullable outCount)
OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

这个函数是获取某个类对象的实例方法列表或者元类对象的列表,仍然是只有实现的方法才能找出来。


cl: 使用objc_getClass:获取的是实例方法? ; 使用objc_getMetaClass:获取的是类方法列表


outCount是一个列表数量的指针


例:


// 获取实例方法
unsigned int count1;
Method *methods=class_copyMethodList(objc_getClass("Dog"), &count1);
NSLog(@"实例方法的个数%d",count1);

for (int i=0; i
Method method=methods[i];
[self getMethodDescription:method];
}


//获取元类对象方法
unsigned int count2;
Method *methods2=class_copyMethodList(objc_getMetaClass("Dog"), &count2);
NSLog(@"元类对象的个数%d",count2);
for (int i=0; i
Method method=methods2[i];
[self getMethodDescription:method];
}

6、通过Method来获取 SEL


OBJC_EXPORT SEL _Nonnull
method_getName(Method _Nonnull m)
OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

例:


Method method=class_getClassMethod(objc_getMetaClass("Dog"), sel_registerName("eat"));
SEL sel=method_getName(method);
NSLog(@"%s",sel_getName(sel));

?

相关文档

  • 不敢承认错误的小学作文
  • 七年级下册历史知识点框架图
  • 海文考研复习计划安排
  • 漫画铅笔画男生
  • 干嘛呢 for Android 1.0.2 发布 找到附近和你有同样想法的人
  • 幸福语录经典语录大全
  • 这个冬天并不冷的小学作文
  • [Android]从视频流读取帧图像保存到本地
  • 克拉玛依有机场吗?
  • 小米6内屏坏了
  • 讲座 | lidar目标检测------图森未来CTO王乃岩
  • 微星ZH77A-G43的板载网卡是什么
  • 干煸四季豆用焯水吗,干煸四季豆怎么吃好
  • 小乌龟之死
  • 红米note7选哪个版本
  • 究竟谁更苦
  • 小学六年级的语文复习计划范文
  • 大中专毕业生就业介绍信格式
  • 什么是焦虑抑郁症_预防方法
  • 关于励志的记叙文
  • 小学生庆2021年国庆演讲
  • 青春的脚步日记5则
  • 关于开展换届选举工作的请示
  • 艺星医疗 杭州艺星医疗美容医院
  • 工商局国际消费者权益日活动的工作总结
  • mysql怎么跑代码_怎么去调用mysql的库的代码
  • 我与中国传统文化的作文
  • 立雪程门
  • 论文概述(KNN算法)
  • 监狱警察入党申请书范文
  • 猜你喜欢

    电脑版