作者:Mitchell
一循签、簡介
- 在 iOS中可以直接調(diào)用某個(gè)對(duì)象的消息方式有兩種:
- 一種是 performSelector:withObject庵朝;
- 再一種就是 NSInvocation公条。
- 第一種方式比較簡單贝攒,能完成簡單的調(diào)用锌杀。但是對(duì)于 >2 個(gè)的參數(shù)或者有返回值的處理答捕,那就需要做些額外工作才能搞定逝钥。那么在這種情況下,我們就可以使用NSInvocation來進(jìn)行這些相對(duì)復(fù)雜的操作拱镐。
二艘款、使用方式
- (void)viewDidLoad {
[super viewDidLoad];
//NSInvocation;用來包裝方法和對(duì)應(yīng)的對(duì)象,它可以存儲(chǔ)方法的名稱沃琅,對(duì)應(yīng)的對(duì)象哗咆,對(duì)應(yīng)的參數(shù),
/*
NSMethodSignature:簽名:再創(chuàng)建NSMethodSignature的時(shí)候,必須傳遞一個(gè)簽名對(duì)象益眉,簽名對(duì)象的作用:用于獲取參數(shù)的個(gè)數(shù)和方法的返回值
*/
//創(chuàng)建簽名對(duì)象的時(shí)候不是使用NSMethodSignature這個(gè)類創(chuàng)建晌柬,而是方法屬于誰就用誰來創(chuàng)建
NSMethodSignature*signature = [ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithNumber:WithContent:)];
//1、創(chuàng)建NSInvocation對(duì)象
NSInvocation*invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.target = self;
//invocation中的方法必須和簽名中的方法一致郭脂。
invocation.selector = @selector(sendMessageWithNumber:WithContent:);
/*第一個(gè)參數(shù):需要給指定方法傳遞的值
第一個(gè)參數(shù)需要接收一個(gè)指針年碘,也就是傳遞值的時(shí)候需要傳遞地址*/
//第二個(gè)參數(shù):需要給指定方法的第幾個(gè)參數(shù)傳值
NSString*number = @"1111";
//注意:設(shè)置參數(shù)的索引時(shí)不能從0開始,因?yàn)?已經(jīng)被self占用展鸡,1已經(jīng)被_cmd占用
[invocation setArgument:&number atIndex:2];
NSString*number2 = @"啊啊啊";
[invocation setArgument:&number2 atIndex:3];
//2屿衅、調(diào)用NSInvocation對(duì)象的invoke方法
//只要調(diào)用invocation的invoke方法,就代表需要執(zhí)行NSInvocation對(duì)象中制定對(duì)象的指定方法莹弊,并且傳遞指定的參數(shù)
[invocation invoke];
}
- (void)sendMessageWithNumber:(NSString*)number WithContent:(NSString*)content{
NSLog(@"電話號(hào)%@,內(nèi)容%@",number,content);
}
三涤久、封裝
-
這里對(duì) NSInvocation 進(jìn)行了封裝,如果想使用忍弛,直接下載即可拴竹。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者