ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Method和SEL和IMP分别说下再谈下对IMP的理解?(iOS面试题)

2021-07-17 13:58:22  阅读:249  来源: 互联网

标签:面试题 谈下 void selector IMP Method SEL method


Method

先看下定义

  1. List item
  2. runtime.h/// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型
  3. typedef struct objc_method *Method;
  4. struct objc_method {
  5. SEL method_name                                          OBJC2_UNAVAILABLE;
    
  6. char *method_types                                       OBJC2_UNAVAILABLE;
    
  7. IMP method_imp                                           OBJC2_UNAVAILABLE;
    
  8. }

Method和我们平时理解的函数是一致的,就是表示能够独立完成一个功能的一段代码,比如:

    • (void)logName
  1. {
  2. NSLog(@“name”);
  3. }

这段代码,就是一个函数。

我们来看下objc_method这个结构体的内容:

  • SEL method_name 方法名
  • char *method_types 方法类型
  • IMP method_imp 方法实现

在这个结构体重,我们已经看到了SEL和IMP,说明SEL和IMP其实都是Method的属性。

我们接着来看SEL。

SEL

还是先看定义

  1. Objc.h
  2. /// An opaque type that represents a method selector.代表一个方法的不透明类型
  3. typedef struct objc_selector *SEL;

这里要先说明下selector和SEL的关系,我在写本文的时候,其实搜索的是selector,直到我看到了selector的定义,才发现我理解一直不对。

  1. @property SEL selector;

在文档中,selector的定义都是这样声明,也就是说:selector是SEL的一个实例,只是在iOS中,selector的使用是如此的频繁,我们才会把他当成一个概念。

selector怎么理解呢?我们可以想想股票,比如市场上有如此多公司在纳斯达克上市,而且他们的名字又非常的长,或者有些公司的名称也是相似的,都是**有限公司。那当市场去指定一个股票的时候,效率会非常低,当你着急想买股票的时候,你会跟你的经纪人说:“hi,peter,给我买一百股Tuniu limited liability company的股票吗?”,也许等你说完,经纪人输入完,市场就变化了,所以纳斯达克通常用代码,比如“TOUR”.这里的selector有类似的作用,就是让我们能够快速找到对应的函数。

文档中是这样讲的:

A method selector is a C string that has been registered (or “mapped“)
with the Objective-C runtime. Selectors generated by the compiler are
automatically mapped by the runtime when the class is loaded.

在iOS中,runtime会在运行的时候,通过load函数,将所有的methodhash然后map到set中。这样在运行的时候,寻找selector的速度就会非常快,不会因为runtime特性牺牲太多的性能。

selector既然是一个string,我觉得应该是类似className+method的组合,命名规则有两条:

  • 同一个类,selector不能重复
  • 不同的类,selector可以重复

这也带来了一个弊端,我们在写C代码的时候,经常会用到函数重载,就是函数名相同,参数不同,但是这在Objective-C中是行不通的,因为selector只记了method的name,没有参数,所以没法区分不同的method。

比如:

1 - (void)caculate(NSInteger)num;
2.
3.- (void)caculate(CGFloat)num;

是会报错的。

我们只能通过命名来区别:

1.- (void)caculateWithInt(NSInteger)num;
2.
3.- (void)caculateWithFloat(CGFloat)num;

IMP

看下IMP的定义

1./// A pointer to the function of a method implementation. 指向一个方法实现的指针
2. typedef id (*IMP)(id, SEL, …);
3.#endif

这个就比较好理解了,就是指向最终实现程序的内存地址的指针。

综上,在iOS的runtime中,Method通过selector和IMP两个属性,实现了快速查询方法及实现,相对提高了性能,又保持了灵活性。

原:https://www.jianshu.com/p/2f1ef81e2b6d

标签:面试题,谈下,void,selector,IMP,Method,SEL,method
来源: https://blog.csdn.net/iOSpipi/article/details/118855368

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有