虽然obj-c的语法格式略显繁琐,但它和ruby都从某些方面继承了smalltalk的某些动态的东西。这些东西是
C和C++之类的静态语言所不曾有的。
比如ruby中可以将一个类或对象的所有方法枚举出来,在obj-c中我们同样可以这样做:
#import <Foundation/Foundation.h>
int main(void){
@autoreleasepool{
unsigned int count = 0;
Method *ms = class_copyMethodList([NSArray class],&count);
for(int i=0;i<count;i++){
char *ret_type = method_copyReturnType(ms[i]);
const char *name = sel_getName(method_getName(ms[i]));
NSLog(@"%d : %s(%d) : ret : %s",i,name,
method_getNumberOfArguments(ms[i]),
ret_type);
free(ret_type);
}
}
return 0;
}
obj-c中还有SEL和IMP的概念,真是和动态语言有的一拼鸟。
上面枚举的是类的实例方法,我们还可以枚举类方法:
NSLog(@"now query class methods :");
ms = class_copyMethodList(object_getClass([NSArray class]),&count);
for(int i=0;i<count;i++){
char *ret_type = method_copyReturnType(ms[i]);
const char *name = sel_getName(method_getName(ms[i]));
NSLog(@"%d : %s(%d) : ret : %s",i,name,
method_getNumberOfArguments(ms[i]),
ret_type);
free(ret_type);
}
有人可能会问了:如果给类添加分类或协议的方法可以枚举出来吗?我还没试。不过很好验证,可以自己动手试一下。
时间: 2024-12-02 13:55:37