一、isKindOfClass、isMemberOfClass和isSubclassOfClass区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 1.首先申明 四个类 A->B->C->D ,继承关系 A继承B,B继承C,C继承D。即D是最顶层的父类,A是最基层的子类。 A *a = [[A alloc]init]; 2.isKindOfClass(对象方法) [a isKindOfClass:[A class]] [a isKindOfClass:[B class]] [a isKindOfClass:[C class]] [a isKindOfClass:[D class]]
3.isMemberOfClass(对象方法) [a isMemberOfClass:[A class]] [a isMemberOfClass:[B class]] [a isMemberOfClass:[C class]] [a isMemberOfClass:[D class]]
4.isSubclassOfClass(类方法) [A isSubclassOfClass:[A class]] [A isSubclassOfClass:[B class]] [A isSubclassOfClass:[C class]] [A isSubclassOfClass:[D class]]
|
总结:isKindOfClass:确定一个对象是否是一个类的成员,或者是派生自该类的成员.(判断是否是这个类或者这个类的子类的实例)
isMemberOfClass:确定一个对象是否是当前类的成员.(判断是否是这个类的实例)
二、object_getClass(obj)与[obj class]区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| void testClassdifference() { NSObject *obj = [NSObject new]; Class cls = object_getClass(obj); Class cls2 = [obj class]; NSLog(@"实例对象:%p-%p" , cls,cls2); Class classObj = [obj class]; Class cls3 = object_getClass(classObj); Class cls4 = [classObj class]; NSLog(@"类对象:%p-%p",cls3,cls4); Class metaClassObj = object_getClass(classObj); Class cls5 = object_getClass(metaClassObj); Class cls6 = [metaClassObj class]; NSLog(@"元类对象:%p-%p",cls5,cls6);
Class rootClassObj = object_getClass(metaClassObj); Class cls7 = object_getClass(rootClassObj); Class cls8 = [rootClassObj class]; NSLog(@"Root元类对象:%p-%p",cls7,cls8); }
iOSInterview[8880:1076288] 实例对象:0x107173ea8-0x107173ea8 iOSInterview[8880:1076288] 类对象:0x107173e58-0x107173ea8 iOSInterview[8880:1076288] 元类对象:0x107173e58-0x107173e58 iOSInterview[8880:1076288] Root元类对象:0x107173e58-0x107173e58
|
总:object_getClass(obj)返回的是obj中的isa指针;
[obj class]则分两种情况:
一是当obj为实例对象时,[obj class]中class是实例方法:- (Class)class,返回的obj对象中的isa指针,也即其本身;
二是当obj为类对象(包括元类和根类以及根元类)时,调用的是类方法:+ (Class)class,返回的结果为其本身