iOS performSelector傳遞兩個以上參數(shù)

如題如何使用performSelector傳遞兩個以上參數(shù)以及如何傳遞結(jié)構(gòu)體
分兩個問題:
1.如何傳遞兩個以上參數(shù)
2.如何傳遞結(jié)構(gòu)體

1 如何傳遞兩個以上參數(shù)

有四種方式可以實現(xiàn)
1.將所有參數(shù)放入一個字典/數(shù)組傳過去
2.使用objc_msgSend()傳遞
3.用NSInvocation傳遞
4.利用runtime特性傳遞

a 將所有參數(shù)放入一個字典/數(shù)組傳過去

思路:這種方式就是將所有參數(shù)都放到一個字典/數(shù)組中衫哥,然后將數(shù)組/字典當(dāng)作一個參數(shù)傳給要調(diào)用的方法茎刚。

注意點:這種方式需要改動要調(diào)用的方法的取參數(shù)的方式,比如使用字典傳遞撤逢,雙方約定每一個參數(shù)放入字典對應(yīng)的key是什么膛锭,在方法哪部才能從對應(yīng)的key中取出參數(shù)值粮坞。

具體代碼如下:

//封裝參數(shù)
    NSDictionary *dic = @{@"param1":@"this is a string",@"param2":@[@2,@3,@3],@"param3":@123};
//調(diào)用方法
    [self performSelector:@selector(testFunctionWithParams:) withObject:dic];

- (void)testFunctionWithParams:(NSDictionary *)paramDic {
    NSLog(@"%s dic:%@",__FUNCTION__, paramDic);
}

b 使用objc_msgSend()傳遞

思路:利用objc_msgSend() 方法可以傳遞多個參數(shù)的特性調(diào)用方法執(zhí)行

具體代碼如下:

((void (*)(id,SEL,NSString *, NSArray *, NSInteger))objc_msgSend)(self, @selector(textFunctionWithParam:param2:param3:),@"111",@[@2,@3],123);

//有三個參數(shù)的方法
-(void)textFunctionWithParam:(NSString *)param1 param2:(NSArray *)param2 param3:(NSInteger)param3 {
    NSLog(@"param1:%@, param2:%@, param3:%ld",param1, param2, param3);
}

c 用NSInvocation傳遞

思路:將方法調(diào)用采用NSInvocation調(diào)用,NSInvocation 不限制參數(shù)數(shù)量

這里可以了解一下NSInvocation的用法http://www.reibang.com/p/e24b3420f1b4

具體代碼如下:

//可以傳多個參數(shù)的方法
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects
{
    // 方法簽名(方法的描述)
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
    if (signature == nil) {
        
        //可以拋出異常也可以不操作初狰。
    }
    
    // NSInvocation : 利用一個NSInvocation對象包裝一次方法調(diào)用(方法調(diào)用者莫杈、方法名、方法參數(shù)奢入、方法返回值)
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    
    // 設(shè)置參數(shù)
    NSInteger paramsCount = signature.numberOfArguments - 2; // 除self筝闹、_cmd以外的參數(shù)個數(shù)
    paramsCount = MIN(paramsCount, objects.count);
    for (NSInteger i = 0; i < paramsCount; i++) {
        id object = objects[i];
        if ([object isKindOfClass:[NSNull class]]) continue;
        [invocation setArgument:&object atIndex:i + 2];
    }
    
    // 調(diào)用方法
    [invocation invoke];
    
    // 獲取返回值
    id returnValue = nil;
    if (signature.methodReturnLength) { // 有返回值類型,才去獲得返回值
        [invocation getReturnValue:&returnValue];
    }
    
    return returnValue;
}

//調(diào)用方法
NSArray *paramArray = @[@"112",@[@2,@13],@12];
    [self performSelector:@selector(textFunctionWithParam:param2:param3:) withObjects:paramArray];


//要調(diào)用的方法
-(void)textFunctionWithParam:(NSString *)param1 param2:(NSArray *)param2 param3:(NSInteger)param3 {
    NSLog(@"param1:%@, param2:%@, param3:%ld",param1, param2, param3);
}


2 如何傳遞結(jié)構(gòu)體

思路:將結(jié)構(gòu)體封裝成NSValue對象

關(guān)于NSValue的更多內(nèi)容請參照:http://nshipster.cn/nsvalue/

typedef struct TTTestStrout{
   int aaa;
   int bbb;
} testStrout;

   //傳結(jié)構(gòu)體
   testStrout testS = {10000, 1234};
   NSValue *value = [NSValue valueWithBytes:&testS objCType:@encode(testStrout)];
   //dic
   NSDictionary *dataDic = @{@"param1":@"ssfs",@"param2":@[@333,@32343],@"param3":value};

   [self performSelector:@selector(testFunctionWithParams:) withObject:dataDic];


- (void)testFunctionWithParams:(NSDictionary *)paramDic {
   NSLog(@"%s dic:%@",__FUNCTION__, paramDic);
   NSValue *paramValue = paramDic[@"param3"];
   testStrout paramStrout;
   [paramValue getValue:&paramStrout];
   NSLog(@"%d",paramStrout.aaa);
   
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腥光,一起剝皮案震驚了整個濱河市关顷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌武福,老刑警劉巖议双,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捉片,居然都是意外死亡平痰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門伍纫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宗雇,“玉大人,你說我怎么就攤上這事翻斟∮饨福” “怎么了说铃?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵访惜,是天一觀的道長。 經(jīng)常有香客問我腻扇,道長债热,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任幼苛,我火速辦了婚禮窒篱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舶沿。我一直安慰自己墙杯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布括荡。 她就那樣靜靜地躺著高镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畸冲。 梳的紋絲不亂的頭發(fā)上嫉髓,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天观腊,我揣著相機(jī)與錄音,去河邊找鬼算行。 笑死梧油,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的州邢。 我是一名探鬼主播儡陨,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼量淌!你這毒婦竟也來了迄委?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤类少,失蹤者是張志新(化名)和其女友劉穎叙身,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硫狞,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡信轿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了残吩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财忽。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泣侮,靈堂內(nèi)的尸體忽然破棺而出即彪,到底是詐尸還是另有隱情,我是刑警寧澤活尊,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布隶校,位于F島的核電站,受9級特大地震影響蛹锰,放射性物質(zhì)發(fā)生泄漏深胳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一铜犬、第九天 我趴在偏房一處隱蔽的房頂上張望舞终。 院中可真熱鬧,春花似錦癣猾、人聲如沸敛劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夸盟。三九已至,卻和暖如春呐粘,著一層夾襖步出監(jiān)牢的瞬間满俗,已是汗流浹背转捕。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留唆垃,地道東北人五芝。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像辕万,于是被迫代替她去往敵國和親枢步。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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