OC中函数的调用

简介

最近在做一个复杂的界面,涉及到 UINavigationController 、UITabBarController、UIViewController、之间的函数调用,需要把原先在UIViewController中的功能转移到UITabBarController 或者 UINavigationController中,这就导致了界面产生冲突,我已经在UIViewController中完成了这个方法,怎么在UINavigationController中调用

关于objc_msgSend

在对象上调用方法是 Objective-C 中经常使用的功能。用 Objective-C 的术语来说叫做传递消息。消息有名称 (name) 或选择子 (selector) ,可以接受参数,并且还有可能有返回值。

IMP

类的方法列表会把selector的名称的映射到相对应的方法上,使得“动态消息派发系统”能够据此找到相应的方法。这些方法均以函数指针的形式来表示,这种指针就是IMP

id (*IMP) = (id,SEL,...) 

selector(SEL)的生成

SEL的生成分为三种情况
1.无参

SEL selector = NSSelectorFromString(@"log");

2.有参数

SEL selector = NSSelectorFromString(@"logWithAll:type:");

IMP的生成

IMP imp1 = [self methodForSelector:selector];

方法的执行

- (NSString *)logWithAll:(NSString *)name type:(NSString *)type{
    NSLog(@"name is %@  type is %@",name,type);
    return @"aaa";
}

if ([self respondsToSelector:selector]) {
    NSString* (*func)(id,SEL,NSString*,NSString*) = (void *)imp1;
    NSString *result =  func(self,selector,@"哈哈",@"hehe");
    NSLog(@"result is %@",result);
}

结果

结构大概就是这样的

NSString* (*func)(id,SEL,NSString*,NSString*) = (void *)imp1;
返回值                     parmar1  parmar2       IMP

调用

NSString *result =  func(self,selector,@"哈哈",@"hehe");

输出结果


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

推荐阅读更多精彩内容

  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,232评论 0 7
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 776评论 0 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解。 我想这跟知识体系的构建...
    咖啡绿茶1991阅读 983评论 0 1
  • Runtime是一套比较底层的纯C语言API,包含了很多底层的C语言API。在我们平时编写的OC代码中,程序运行时...
    这个年纪的情愫丶阅读 633评论 5 3