您的位置:首页 > 其它

NSInvocation

2016-06-27 22:47 447 查看
#import "NSObject+Extension.h"

@implementation NSObject (Extension)

- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects

{

    // 方法签名(方法的描述)

    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];

    if (signature == nil) {

//        @throw [NSException exceptionWithName:@"牛逼的错误" reason:@"方法找不到" userInfo:nil];

        [NSException raise:@"牛逼的错误" format:@"%@方法找不到", NSStringFromSelector(selector)];

    }

    

    // NSInvocation : 利用一个NSInvocation对象包装一次方法调用(方法调用者、方法名、方法参数、方法返回值)

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    invocation.target = self;

    invocation.selector = selector;

    

    // 设置参数

    NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的参数个数

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

    }

    

    // 调用方法

    [invocation invoke];

    

    // 获取返回值

    id returnValue = nil;

    if (signature.methodReturnLength) { // 有返回值类型,才去获得返回值

        [invocation getReturnValue:&returnValue];

    }

    

    return returnValue;

}

@end

  /** 生成一个方法签名 (这是个对象方法, 就是有 后边这个SEL对象方法的对象) */

    NSMethodSignature * methodSignature = [self methodSignatureForSelector:@selector(setName:andAge:andBirthday:)];

    

    /** 生成一个方法签名 (这是个类方法 就是有后边这个SEL类方法的类) */

//    NSMethodSignature * methodSignature = [ViewController instanceMethodSignatureForSelector:@selector(setName:andAge:andBirthday:)];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: