简介
最近在做一个复杂的界面,涉及到 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");
输出结果