美文网首页IOS
- (IMP)methodForSelector与+ (IMP)

- (IMP)methodForSelector与+ (IMP)

作者: IcebergHorseman | 来源:发表于2015-12-21 17:04 被阅读462次

导语

今天在编码的时候,无意间看到了- (IMP)methodForSelector函数,让我联想到平时经常用的+ (IMP)instanceMethodForSelector函数。这两个函数从字面意思来看很相近,但是既然同时存在,二者一定存在区别。于是,结合开发文档和代码测试,进行了一些探索。

+ (IMP)instanceMethodForSelector:(SEL)aSelector

功能概述:根据指定的sSelector,遍历类的实例方法列表,返回对应的函数指针。
有两个地方需要注意:
一、这是一个类函数,调用者是一个Class;
二、函数返回结果的类型是实例函数指针,而非类函数指针。

代码测试:

@interface TestObject : NSObject
@end

@implementation TestObject

 - (void)testFun
  {
  }

int main(int argc, const char * argv[])
 {
      IMP p = [TestObject instanceMethodForSelector:@selector(testFun)];
      NSLog(@"%p " , p);
      
      return 0;
 }

输出结果:

 2015-12-21 16:17:02.217 TestProject[2916:166056] 0x100000ad0 

猜想:该函数内部实现过程中创建了一个实例对象,然后遍历实例对象的函数列表,搜索指定的函数名对应的函数指针。

- (IMP)methodForSelector:(SEL)aSelector

功能概述:根据指定的sSelector,返回调用者函数列表中对应的函数指针。
有两个地方需要注意:
一、这是一个实例对象函数,调用者可以是实例对象也可以是类对象(在Object C中,类本身也是对象)
二、函数返回结果的类型可能是实例函数指针,也可能是类函数指针。
代码测试:

int main(int argc, const char * argv[])
 {
      TestObject obj = [TestObject new];
    
      IMP pObj = [obj methodForSelector:@selector(testFun)];
    
      IMP pClass = [TestObject methodForSelector:@selector(testFun)];

      NSLog(@"%p" , pObj);
      NSLog(@"%p" , pClass);
      
      return 0;
 }    

输出结果:

2015-12-21 16:39:12.711 TestProject[3002:179046] 0x100000ad0
2015-12-21 16:39:12.713 TestProject[3002:179046] 0x7fff8878bd40

结论:根据上面的输出结果,可以看出实例对象调用- (IMP)methodForSelector与类调用+ (IMP)instanceMethodForSelector输出结果是一致的,都是实例对象的函数指针;而类对象调用- (IMP)methodForSelector输出结果则是类本身的类函数指针。

综述:这两个函数除了类型上的区别之外,- (IMP)methodForSelector函数的使用范围更广一些,既可以获得实例对象函数指针,又能获去类对象函数指针。此外,+ (IMP)instanceMethodForSelector更像是对- (IMP)methodForSelector的一次封装,用来更便捷地获取实例对象的函数指针。

相关文章

  • - (IMP)methodForSelector与+ (IMP)

    浮于表面探究问题不失为一种方法,但是弄清楚本质才是真正意义上的解决疑惑。 之前已经写过一篇博客- (IMP)met...

  • - (IMP)methodForSelector与+ (IMP)

    导语 今天在编码的时候,无意间看到了- (IMP)methodForSelector函数,让我联想到平时经常用的+...

  • - (IMP)methodForSelector:(SEL)aS

    这个方法是获取某个SEL的IMP问题来了,什么是SEL,什么是IMP? 1. SEL Objective-C是动态...

  • oracle数据库导入导出命令!

    Oracle数据导入导出imp/exp功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备...

  • Oracle数据库的导入和导出

    1. imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份。 使用:在...

  • IMP

    IMP定义在runtime的objc.h中,定义如下: typedef说明形式:typedef 返回类型(新类型...

  • IMP

    IMPTest声明方法 新建IMPTest类,创建方法 ViewController调用方法 结果输出

  • IMP

    一.什么是IMP IMP是”implementation”的缩写,它是objetive-C 方法(method)实...

  • imp

    imp 重载模块功能from imp import reload当在shell中使用一个模块,原始代码改了,要使用...

  • runTime class_addMethod

    class_addMethod(Class cls, SEL name, IMP imp, const char ...

网友评论

    本文标题:- (IMP)methodForSelector与+ (IMP)

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