Class c = [self class];
该方法既是实例方法也是类方法。它返回一个带有很多神奇信息的C构造体,比如实例变量、方法等等。所有这些和java.lang.reflect包相比都有些过时了,利用Objective-C访问这些信息的接口看起来很复杂。这可能就是故意设计成这样来“过滤”一些不合格的程序员。目前为止我唯一使用这些的地方就是为下面将要介绍的isKindOfClass:方法提供参数。一直以来我都不需要去窥视类结构的内容。
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 }
如果你需要一个精确的类匹配,而不是匹配任何继承类,你就可以使用isMemberOfClass:方法。
if([obj respondsToSelector:@selector(aMethod:)])
{ // it's there, so we can call it [obj aMethod:YES];
}
当然,利用Objective-C的反射你可以做更多的事情,这里我只是尝试谈谈反射机制最常见的应用。如果你需要在你的软件中加入核心的动态特性,你就需要熟悉下这些文档: