最近写一个类库时,需要动态的调用类方法,使用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];
}
更多优质文章,可以微信扫码关注: