isKindOfClass和isMemberOfClass 区别
isKindOfClass和isMemberOfClass 都是NSObject的比较Class的方法。
但两个有很大区别:
isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员。
isMemberOfClass只能确定一个对象是否是当前类的成员。
例如:
NSArray *arr1 = [NSArrayarray]; NSArray *arr2 = [NSArrayarray]; NSObject *ob = [[NSObjectalloc] init]; NSLog(@"%hhd", [[NSArrayarray] isKindOfClass:[NSObjectclass]]); // YES NSLog(@"%hhd", [[NSArrayarray] isMemberOfClass:[NSArrayclass]]); // NO NSLog(@"%hhd", [arr1 isKindOfClass:[ob class]]); // YES NSLog(@"%hhd", [arr1 isMemberOfClass:[ob class]]); // NO NSLog(@"%hhd", [arr1 isKindOfClass:[arr2 class]]); // YES NSLog(@"%hhd", [arr1 isMemberOfClass:[arr2 class]]); // YES
[[NSArray array] isMemberOfClass:[NSArray class]]返回NO的原因在于NSArray是一个类簇,意味着每个NSArray的实例都是NSArray内部子类的一个实例,我们会发现[[NSArray array] class]返回值为__NSArray0, 而[NSArray class]返回值为NSArray,所以二者不等。
关于NSArray类簇,请查看http://blog.sunnyxx.com/2014/12/18/class-cluster/