美文网首页
iOS开发-iOS中的SEL,IMP和isa

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

作者: 疯狂小鱼人 | 来源:发表于2017-06-05 11:14 被阅读0次

    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  ,是一个什么。

    相关文章

      网友评论

          本文标题:iOS开发-iOS中的SEL,IMP和isa

          本文链接:https://www.haomeiwen.com/subject/clhifxtx.html