iOS开发-iOS中的SEL,IMP和isa

SEL:类成员方法的指针。(不同于C语言中的函数指针,函数指针直接保存了方法的地址,SEL只是方法编号)

IMP:一个函数指针,保存了方法的地址。

IMP和SEL关系:

每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的。在这个结构体中又包括指向其父类类定义的指针以及Dispatch table.Dispatch table是一张SEL和IMP的对应表。也就是说方法编号SEL最后还是要通过Dispatch table表寻找对应的IMP,IMP就是一个函数指针,然后执行这个方法。

SEL相关问题:

通过@selector()可以取到类方法的编号。 SEL methodId = @selector(func1);

获取编号后如何执行对应方法:[self performSelector:methodIdWithObject:nil];

通过编号获取方法:NSString *methodName = NSStringFromSelector(methodId);

IMP相关问题:

获得:IMP methodPoint = [self methodForSelector:methodId];

methodPoint();

为什么不直接获得函数指针,而要从SEL这个编号走一圈再回到函数指针呢?

有了SEL这个中间过程,我们可以对一个编号和什么方法映射做些操作,也就是说我们可以一个SEL指向不同的函数指针,这样就可以完成一个方法名在不同时候执行不同的函数体。另外可以将SEL作为参数传递给不同的类执行。 

isa:字面意思就是 is a  ,是一个什么。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,826评论 0 9
  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 7,372评论 0 20
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,731评论 0 6
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 6,220评论 0 7
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 7,096评论 0 35