/LXPerformSelector

支持各种类型以及任意数量参数的 performSelector

Primary LanguageObjective-C

LXPerformSelector

启发自 Awhisper/vk_msgSend 这个项目。

  • 支持基础类型,例如 BOOLintdoubleCGFloatNSInteger 等类型。
  • 支持 id 类型,包括各种类型的对象和闭包。
  • 支持指针类型,例如 char *char **id *,以及 ClassSELCGColorRef 等结构体指针和函数指针。
  • 结构体类型只支持 NSRangeCGSizeCGPointCGVectorCGAffineTransformUIOffsetUIEdgeInsetsCATransform3D
// 参数类型 const char *,NSUInteger
// 返回类型 id
NSString *string = [NSClassFromString(@"NSString") lx_performSelector:@selector(stringWithCString:encoding:), 
                    "这有个 C 字符串。。。", NSUTF8StringEncoding];
printf("%s\n", [string UTF8String]);
// 参数类型 NSUIntege
// 返回类型 const char *
id cStirngValue = [string lx_performSelector:@selector(cStringUsingEncoding:), NSUTF8StringEncoding];
printf("cStirngValue: %s\n", [cStirngValue pointerValue]);
// 参数类型 NSUInteger
// 返回类型 NSUInteger
id lengthValue = [string lx_performSelector:@selector(lengthOfBytesUsingEncoding:), NSUTF8StringEncoding];
NSUInteger length = [lengthValue unsignedIntegerValue] + 1;
// 参数类型 char *,NSUInteger,NSUInteger
// 返回类型 BOOL
char buffer[length];
id success = [string lx_performSelector:@selector(getCString:maxLength:encoding:), 
                buffer, length, NSUTF8StringEncoding];
printf("Success? %s. Buffer: %s\n", [success boolValue] ? "YES" : "NO", buffer);
// 参数类型 NSURL,BOOL,NSError **
// 返回类型 BOOL
NSError * __autoreleasing error; // 这里需使用 __autoreleasing
success = [string lx_performSelector:@selector(writeToFile:atomically:encoding:error:),
               nil, YES, NSUTF8StringEncoding, &error];
printf("Success? %s%s\n", [success boolValue] ? "YES." : "NO. ", error.localizedDescription.UTF8String);
// 参数类型 CGRect
// 返回类型 CGRect
[self.view lx_performSelector:@selector(setFrame:), CGRectMake(100, 200, 300, 400)];
printf("%s\n", [[[self.view lx_performSelector:@selector(frame)] description] UTF8String]);
// 返回类型 Class
id classValue = [self lx_performSelector:@selector(class)];
printf("%s\n", [[(Class)[classValue pointerValue] description] UTF8String]);
// 返回类型 CGColorRef
id cgColorValue = [self.view.layer lx_performSelector:@selector(backgroundColor)];
printf("%p %p\n", [cgColorValue pointerValue], self.view.layer.backgroundColor);