iOS開發(fā)之NSInvocation

一.概述

在iOS中我們直接調(diào)某個(gè)對(duì)象的消息的方式有2種

  • 系統(tǒng)NSObject類型中提供了2個(gè)方法

// 一個(gè)參數(shù)
[self performSelector:<#(SEL)#> withObject:<#(id)#>];
// 兩個(gè)參數(shù)
[self performSelector:<#(SEL)#> withObject:<#(id)#> withObject:<#(id)#>];


- 使用NSInvocation.

### 二. NSInvocation的使用

```objc
- (void)viewDidLoad {
  [super viewDidLoad];

  //方法
  SEL selector = @selector(run);
  //初始化方法簽名(方法的描述)   
   NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
  // NSInvocation : 利用一個(gè)NSInvocation對(duì)象包裝一次方法調(diào)用(方法調(diào)用者莱没、方法名辜王、方法參數(shù)姚淆、方法返回值)
  NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
  //設(shè)置調(diào)用者
  invocation.target = self;
  //設(shè)置調(diào)用方法
  invocation.selector = selector;
  //設(shè)置參數(shù)
  NSUInteger object = 5;
  //參數(shù)從2開始于样,index為0表示target,1為_cmd 
  [invocation setArgument:&object atIndex:2];
  //調(diào)用方法
  [invocation invoke];

}
-(void)run:(NSInteger)num{


  NSLog(@"run");
}

三. NSInvocation實(shí)現(xiàn)多參數(shù)的封裝

系統(tǒng)的NSObject提供的performSelector的方法只提供了最多兩個(gè)參數(shù)的調(diào)用,我們可以使用NSInvocation封裝一個(gè)多個(gè)參數(shù)的performSelector方法.

#import <Foundation/Foundation.h>

@interface NSObject (MutiPerform)

-(id)performSelector:(SEL)Selector withObjects:(NSArray *)objects;
@end


#import "NSObject+MutiPerform.h"

@implementation NSObject (MutiPerform)

-(id)performSelector:(SEL)selector withObjects:(NSArray *)objects{

    //初始化方法簽名
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
    
    // 如果方法selector不存在
    
    if(signature == nil){

        // 拋出異常
        NSString *reason = [NSString stringWithFormat:@"%@方法不存在",NSStringFromSelector(selector)];
        @throw [NSException exceptionWithName:@"error" reason:reason userInfo:nil];
    }
    
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    invocation.target = self;
    invocation.selector = selector;
    
    //參數(shù)個(gè)數(shù)signature.numberOfArguments 默認(rèn)有一個(gè)_cmd 一個(gè)target 所以要-2
    NSInteger paramsCount = signature.numberOfArguments - 2;
    
    // 當(dāng)objects的個(gè)數(shù)多于函數(shù)的參數(shù)的時(shí)候,取前面的參數(shù)
    //當(dāng)當(dāng)objects的個(gè)數(shù)少于函數(shù)的參數(shù)的時(shí)候,不需要設(shè)置,默認(rèn)為nil
    paramsCount = MIN(paramsCount, objects.count);
    
    for (NSInteger index = 0; index < paramsCount; index++) {
        
        id object = objects[index];

        // 對(duì)參數(shù)是nil的處理
        if([object isKindOfClass:[NSNull class]]) continue;
        
        [invocation setArgument:&object atIndex:index+2];

    }
    //調(diào)用方法
    [invocation invoke];

    // 獲取返回值
    id returnValue = nil;
    
    //signature.methodReturnLength == 0 說(shuō)明給方法沒有返回值
    if (signature.methodReturnLength) {

        //獲取返回值
        [invocation getReturnValue:&returnValue];
    }
    
    return returnValue;
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掩驱,一起剝皮案震驚了整個(gè)濱河市芒划,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昙篙,老刑警劉巖腊状,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诱咏,死亡現(xiàn)場(chǎng)離奇詭異苔可,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)袋狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門焚辅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苟鸯,你說(shuō)我怎么就攤上這事同蜻。” “怎么了早处?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵湾蔓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我砌梆,道長(zhǎng)默责,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任咸包,我火速辦了婚禮桃序,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烂瘫。我一直安慰自己媒熊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芦鳍,像睡著了一般嚷往。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柠衅,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天间影,我揣著相機(jī)與錄音,去河邊找鬼茄茁。 笑死魂贬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裙顽。 我是一名探鬼主播付燥,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愈犹!你這毒婦竟也來(lái)了键科?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漩怎,失蹤者是張志新(化名)和其女友劉穎勋颖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勋锤,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饭玲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叁执。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茄厘。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谈宛,靈堂內(nèi)的尸體忽然破棺而出次哈,到底是詐尸還是另有隱情,我是刑警寧澤吆录,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布窑滞,位于F島的核電站,受9級(jí)特大地震影響恢筝,放射性物質(zhì)發(fā)生泄漏哀卫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一滋恬、第九天 我趴在偏房一處隱蔽的房頂上張望聊训。 院中可真熱鬧,春花似錦恢氯、人聲如沸带斑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勋磕。三九已至妈候,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挂滓,已是汗流浹背苦银。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赶站,地道東北人幔虏。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贝椿,于是被迫代替她去往敵國(guó)和親想括。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉烙博,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評(píng)論 0 9
  • 我們常常會(huì)聽說(shuō) Objective-C 是一門動(dòng)態(tài)語(yǔ)言瑟蜈,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,199評(píng)論 0 7
  • Objective-C中有兩個(gè)NSObject渣窜,一個(gè)是NSObject類铺根,另一個(gè)是NSObject協(xié)議。而其中NS...
    ScaryMonsterLyn閱讀 766評(píng)論 0 2
  • 目錄 Objective-C Runtime到底是什么 Objective-C的元素認(rèn)知 Runtime詳解 應(yīng)用...
    Ryan___閱讀 1,939評(píng)論 1 3
  • 像我乔宿,有時(shí)候睡下去了位迂,就不想起來(lái),現(xiàn)在也是在臥榻上碼字予颤,我追求著一種安全感囤官,可能是我從小就比較缺失吧,當(dāng)然也有...
    簡(jiǎn)碸閱讀 211評(píng)論 0 0