对isa、IMP、SEL理解

ISA

@interface Object
{
    Class isa;  /* A pointer to the instance's class structure */
}

每一个类都会有isa指针,该指针指向类的结构体,如在底层objc_msgSent() 就是通过isa来查找该类的。再通过该类的super class查找父类等

SEL

只是代表了选择器(方法名) 并不是方法的实现。
每一类都有一个调度表(dispatch table) 该表存储SEL 和Imp SEL相当于方法的名 并没有实现 当调用函数是可以根据sel 找到Imp imp则为指向函数实现
SEL的获取与使用

//第一种获取方法
SEL ABC =  @selector(aaa:);
//第二种获取方法(建议使用这个)
SEL ABC1 = NSSelectorFromString(@"aaa:");
[self performSelector:ABC];

IMP

函数现实指针

#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif
我们可以自己构建IMP指针
/**
 动态添加方法(这个是定义了一个函数实现指针IMP)

 @param self 接收者
 @param _cmd 选择器
 @param value 参数
 */
void dynamicMethod(id self, SEL _cmd, id value) {

    NSLog(@"首先尝试动态添加方法");
}
IMP  imp = (IMP)dynamicMethod;

//也可以通过选择器获取其IMP
IMP methodPoint = [self methodForSelector:methodId];

//通过runtime获取IMP
IMP imp = class_getMethodImplementation([self class], @selector(abc:));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,806评论 0 9
  • 一、Runtime简介 Runtime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...
    林安530阅读 4,671评论 0 2
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,708评论 33 466
  • 前言: 关于Runtime的资料网上一搜很多,但总是写的只言片语,不太全面。最近花了一个星期的时间重新学习Runt...
    小霍同学阅读 3,641评论 0 0
  • runtime 运行时语言,实现Object-C的C语言库,将OC转换成C进行编译的过渡者。 作为一门动态编程语言...
    夜雨聲煩_阅读 3,529评论 0 0