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

當(dāng)我們有方法名和參數(shù)列表拌消,想要動態(tài)地給對象發(fā)送消息,可用通過反射函數(shù)機(jī)制來實(shí)現(xiàn)割以,有兩種常用的做法:

一启具、performSelector

常用的方法有這三個(gè)本讥,其中aSelector可以通過 NSSelectorFromString 方法拿到
但是 performSelector 的缺點(diǎn)是最多只支持傳遞兩個(gè)參數(shù)

二、NSInvocation

// 測試反射函數(shù)
- (void)printWithString:(NSString *)string withNum:(NSNumber *)number withArray:(NSArray *)array {
    NSLog(@"%@, %@, %@", string, number, array[1]);
}
- (void)test {
    NSString *str = @"哈哈哈";
    NSNumber *num = @20;
    NSArray *arr = @[@"ABC", @"DEF"]; // [self printWithString:str withNum:num withArray:arr];
    SEL sel = NSSelectorFromString(@"printWithString:withNum:withArray:");
    NSArray *objs = [NSArray arrayWithObjects:str, num, arr, nil];
    [self performSelector:sel withObjects:objs];
} 
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects { // 方法簽名(方法的描述)
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; 
   if (signature == nil) { //可以拋出異常也可以不操作鲁冯。
   } 
    // NSInvocation : 利用一個(gè)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ù)個(gè)數(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;
}

三跨扮、objc_msgSend

objc_msgSend的寫法要復(fù)雜一點(diǎn)序无,具體可以參看這篇文章,講的很清楚
但是有個(gè)缺點(diǎn)是衡创,需要指定好傳遞參數(shù)的類型帝嗡,是不是可以直接都用id呢?

經(jīng)測試id可用

// objc_msgSend
SEL sel = NSSelectorFromString(@"printWithString:withNum:withArray:");
((void (*) (id, SEL, NSString *, NSNumber *, NSArray *)) objc_msgSend) (self, sel, str, num, arr);


iOS 反射函數(shù): performSelector, NSInvocation, objc_msgSend

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璃氢,一起剝皮案震驚了整個(gè)濱河市哟玷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拔莱,老刑警劉巖碗降,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塘秦,居然都是意外死亡讼渊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門尊剔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爪幻,“玉大人,你說我怎么就攤上這事须误“じ澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵京痢,是天一觀的道長奶甘。 經(jīng)常有香客問我,道長祭椰,這世上最難降的妖魔是什么臭家? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮方淤,結(jié)果婚禮上钉赁,老公的妹妹穿的比我還像新娘。我一直安慰自己携茂,他們只是感情好你踩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讳苦,像睡著了一般带膜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上医吊,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天钱慢,我揣著相機(jī)與錄音,去河邊找鬼卿堂。 笑死束莫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的草描。 我是一名探鬼主播览绿,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穗慕!你這毒婦竟也來了饿敲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逛绵,失蹤者是張志新(化名)和其女友劉穎怀各,沒想到半個(gè)月后倔韭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓢对,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年寿酌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硕蛹。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡醇疼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出法焰,到底是詐尸還是另有隱情秧荆,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布埃仪,位于F島的核電站乙濒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贵试。R本人自食惡果不足惜琉兜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毙玻。 院中可真熱鬧豌蟋,春花似錦、人聲如沸桑滩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽运准。三九已至幌氮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胁澳,已是汗流浹背该互。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留韭畸,地道東北人宇智。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像胰丁,于是被迫代替她去往敵國和親随橘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

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