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

你可能感兴趣的:(OC中函数的调用)