簡(jiǎn)介
最近在做一個(gè)復(fù)雜的界面,涉及到 UINavigationController 、UITabBarController、UIViewController、之間的函數(shù)調(diào)用,需要把原先在UIViewController中的功能轉(zhuǎn)移到UITabBarController 或者 UINavigationController中,這就導(dǎo)致了界面產(chǎn)生沖突,我已經(jīng)在UIViewController中完成了這個(gè)方法,怎么在UINavigationController中調(diào)用
關(guān)于objc_msgSend
在對(duì)象上調(diào)用方法是 Objective-C 中經(jīng)常使用的功能。用 Objective-C 的術(shù)語(yǔ)來(lái)說(shuō)叫做傳遞消息。消息有名稱(chēng) (name) 或選擇子 (selector) ,可以接受參數(shù),并且還有可能有返回值。
IMP
類(lèi)的方法列表會(huì)把selector的名稱(chēng)的映射到相對(duì)應(yīng)的方法上,使得“動(dòng)態(tài)消息派發(fā)系統(tǒng)”能夠據(jù)此找到相應(yīng)的方法。這些方法均以函數(shù)指針的形式來(lái)表示,這種指針就是IMP
id (*IMP) = (id,SEL,...)
selector(SEL)的生成
SEL的生成分為三種情況
1.無(wú)參
SEL selector = NSSelectorFromString(@"log");
2.有參數(shù)
SEL selector = NSSelectorFromString(@"logWithAll:type:");
IMP的生成
IMP imp1 = [self methodForSelector:selector];
方法的執(zhí)行
- (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);
}
結(jié)果
結(jié)構(gòu)大概就是這樣的
NSString* (*func)(id,SEL,NSString*,NSString*) = (void *)imp1;
返回值 parmar1 parmar2 IMP
調(diào)用
NSString *result = func(self,selector,@"哈哈",@"hehe");
輸出結(jié)果

結(jié)果.png