performSelector傳多個參數(shù)


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

- (id)performSelector:(SEL)aSelector
          withObjects:(NSArray *)arguments{
    
    //1.根據(jù)SEL實例化方法簽名
    NSMethodSignature *signature = [[self class]instanceMethodSignatureForSelector:aSelector];
    //2.判斷方法是否存在
    if (signature == nil) {
        //拋出異常
        NSLog(@"不存在這個方法");
        return nil;
    }
    //3.通過類方法實例化NSInvaction對象,設(shè)置target,selector
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    [invocation setTarget:self];
    [invocation setSelector:aSelector];
    
    //獲取參數(shù)的個數(shù),默認方法都有 self,_cmd兩個參數(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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