2

为了这个问题,假设我有一个由以下方法组成的 Objective-C 类:

- (float)method1;
- (CGPoint)method2;
- (NSString *)method3;
- (void)method4;

如何在运行时动态识别上述所有方法的返回类型?

4

1 回答 1

3

您可以使用Objective-C 运行时函数来获取此信息,但有一些限制。下面的代码将做你想要的:

Method method1 = class_getInstanceMethod([MyClass class], @selector(method1));
char * method1ReturnType = method_copyReturnType(method1);
NSLog(@"method1 returns: %s", method1ReturnType);
free(method4ReturnType);

Method method2 = class_getInstanceMethod([MyClass class], @selector(method2));
char * method2ReturnType = method_copyReturnType(method2);
NSLog(@"method2 returns: %s", method2ReturnType);
free(method4ReturnType);

Method method3 = class_getInstanceMethod([MyClass class], @selector(method3));
char * method3ReturnType = method_copyReturnType(method3);
NSLog(@"method3 returns: %s", method3ReturnType);
free(method4ReturnType);

Method method4 = class_getInstanceMethod([MyClass class], @selector(method4));
char * method4ReturnType = method_copyReturnType(method4);
NSLog(@"method4 returns: %s", method4ReturnType);
free(method4ReturnType);

输出:

>>method1 returns: f
>>method2 returns: {CGPoint=dd}
>>method3 returns: @
>>method4 returns: v

返回的字符串method_copyReturnType()是一个 Objective-C 类型的编码字符串,记录在这里。请注意,虽然您可以判断一个方法是否返回一个对象(编码字符串“@”),但您无法判断它是什么类型的对象。

我很好奇你为什么对这样做感兴趣。特别是对于一个新的 Objective-C 程序员,我的第一个倾向是鼓励你思考这是否真的是一个好的设计选择。对于您询问的方法,这非常简单,但是具有更多奇异返回类型的方法可能会导致您使用类型编码进入一些更棘手的问题。

于 2013-11-13T17:24:14.303 回答