OC的反射机制:反射最主要的目的是解耦。
isMemberOfClass:判断是否是某一个类
isKindOfClass:判断是否是某一个类或者该类的子类
类对象的比较:
//获取类对象
- (Class)class {
return object_getClass(self);
}
//获取父类对象
- (Class)superclass {
return [self class]->superclass;
}
//当前实例的类对象等于传入的类对象
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
//当前实例的类对象等于传入的类对象/或者当前实例的父类对象等于传入的类对象
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
元类对象的比较:
+ (Class)class {
return self;
}
+ (Class)superclass {
return self->superclass;
}
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
实例1:
- (void)question1 {
//NSObject基类的元类对象的superclass是NSObject基类的类对象
BOOL result1 = [[NSObject class] isKindOfClass:[NSObject class]]; //YES
BOOL result2 = [[NSObject class] isMemberOfClass:[NSObject class]]; //NO
BOOL result3 = [[Person class] isKindOfClass:[Person class]]; //NO
BOOL result4 = [[Person class] isMemberOfClass:[Person class]]; //NO
NSLog(@"result1 = %d", result1); //1
NSLog(@"result2 = %d", result2); //0
NSLog(@"result3 = %d", result3); //0
NSLog(@"result4 = %d", result4); //0
Person *person = [[Person alloc] init];
NSLog(@"结果1:%d", [person isMemberOfClass:[Person class]]); //1
NSLog(@"结果2:%d", [person isMemberOfClass:[NSObject class]]); //0
NSLog(@"结果3:%d", [person isKindOfClass:[Person class]]); //1
NSLog(@"结果4:%d", [person isKindOfClass:[NSObject class]]); //1
}
网友评论