NSInvocation实现类方法调用

  最近写一个类库时,需要动态的调用类方法,使用NSInvocation时发现

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

没有生成类方法相关的NSMethodSignature方法。
查看NSMethodSignature类,看到有一个方法

+ (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;

根据这个方法,可以知道方法签名更多的是确认方法的格式。我这边参考如下博客:
https://www.jianshu.com/p/6fb4641e6ec5
实现了动态调用类方法,实现代码如下:

- (void)class:(Class)class performSelector:(SEL)aSelector withObjects:(NSArray *)objects {
    NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"v@:@@@"];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    [invocation setTarget:class];
    [invocation setSelector:aSelector];
NSObject
    NSUInteger i = 1;
    for (id object in objects) {
        id tempObject = object;
        if (![tempObject isKindOfClass:[NSObject class]]) {
            if ([tempObject isSubclassOfClass:[JKEventHandlerEmptyObject class]]) {
                tempObject = nil;
            }
        }
        [invocation setArgument:&tempObject atIndex:++i];
    }
    [invocation invoke];
    
}

更多优质文章,可以微信扫码关注:
这里写图片描述

发布了231 篇原创文章 · 获赞 110 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/HHL110120/article/details/96693935