转自:http://blog.sina.com.cn/s/blog_6d723b1f0100q6m6.html
我第一次接触Java的时候就觉得整个反射包都很新颖,它使得Java和解释型的脚本语言更接近了,与此同时也拉开了和主流的C和C++的距离。 在运行时可以窥视到一个对象的类元数据真的很不可思议,尽管这些可能不会在日常应用编程中经常使用到。从Java转到Objective-C的程序员应该会乐见Objective-C也支持反射。实际上,Objective-C有很多诸如动态改变类定义以及创建一个新类的动态特征。不过很难说这些功能有多大的作用,这也让我觉得Objective-C是一个有些臃肿的语言。在我看来,Objective-C有一个定位危机:它是解释型语言还是编译语言?运行时很大程度上是动态的。和C++不同,Objective-C是运行时绑定的。这也是为什么我们可以在实现时定义一个从来没有在头文件中声明的方法,或者通过Category扩展类。不幸的是由于这种臃肿使得找到一些日常编程中有用的东西变得困难,本文就是要去发现其中的一些“宝藏”。
根类NSObject
获取类的元数据
- Class
c = [self class];
动态方程调用
检查继承关系
- for(BaseClass*
base in myArray) { - if([base
isKindOfClass:[ClassOne class]]) { -
// do stuff specific to ClassOne - }
- else
if([base isKindOfClass:[ClassTwo class]]) { -
// do stuff specific to ClassTwo - }
- else
if([base isKindOfClass:[ClassThree class]]) { -
// do stuff specific to ClassThree - }
- //
etc - }
检查是否符合协议
- BOOL
conforms = [obj conformsToProtocol:@protocol(MyInterface)];
检查方法是否存在
- if([obj
respondsToSelector:@selector(aMethod:)]) { // it's there, so we can call it [obj aMethod:YES]; }