
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);