performSelector傳多個(gè)參數(shù)


1.參數(shù)包裝成字典
2.自己實(shí)現(xiàn)對(duì)應(yīng)方法 使用NSMethodSignure,NSInvoation

- (id)performSelector:(SEL)aSelector
          withObjects:(NSArray *)arguments{
    
    //1.根據(jù)SEL實(shí)例化方法簽名
    NSMethodSignature *signature = [[self class]instanceMethodSignatureForSelector:aSelector];
    //2.判斷方法是否存在
    if (signature == nil) {
        //拋出異常
        NSLog(@"不存在這個(gè)方法");
        return nil;
    }
    //3.通過類方法實(shí)例化NSInvaction對(duì)象,設(shè)置target,selector
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    [invocation setTarget:self];
    [invocation setSelector:aSelector];
    
    //獲取參數(shù)的個(gè)數(shù),默認(rèn)方法都有 self,_cmd兩個(gè)參數(shù)
    NSInteger signatureParmCount = signature.numberOfArguments - 2;
    NSInteger resultCount = MIN(signatureParmCount, arguments.count);
    
    //設(shè)置方法參數(shù)
    for (NSInteger i = 0; i < resultCount; i++) {
        id argument = arguments[i];
        if ([argument isKindOfClass:[NSNull class]]) continue;
        [invocation setArgument:&argument atIndex:i+2];
    }
    [invocation invoke];
    
    //返回值,獲取返回值的長度,大于0表示有返回值
    id returnArgument = nil;
    if (signature.methodReturnLength) {
        [invocation getReturnValue:&returnArgument];
    }
    return returnArgument;
}

3.objc_msgsend

    NSString *str = @"字符串objc_msgSend";
    NSNumber *num = @20;
    NSArray *arr = @[@"數(shù)組值1", @"數(shù)組值2"];
    SEL sel = NSSelectorFromString(@"ObjcMsgSendWithString:withNum:withArray:");
    ((void (*) (id, SEL, NSString *, NSNumber *, NSArray *)) objc_msgSend) (self, sel, str, num, arr);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容