isKindOfClass和isMemberOfClass

基础知识

 

+isKindOfClass 类方法是从当前类的isa指向(也就是当前类的元类)开始。沿着superclass继承链查找判断和对比类是否相等。

-isKindOfClass 对象方法从[self class](当前类)开始,沿着superclass继承链查找判断和对比类是否相等。

+is MemberOfClass 类方法直接判断当前类的isa指向(也就是当前类的元类)和对比类是否相等。

-isMwemberOfClass 对象方法是直接判断[self class](当前类)和对比类是否相等。

 isKindOfClass和isMemberOfClass的区别

isKindOfClass来确定一个对象是否是一个类的实例,或者是该类祖先类的实例。
isMemberOfClass只能用来判断前者,不能用来判断后者。

isKindOfClass能检测任何的类都是基于NSObject类这一事实,而isMemberOfClass却不可以。

isKindOfClass和isMemberOfClass_第1张图片

第一列表示的是初始化对象(obj_object),这个对象里面有一个isa指针指向它所属的类,也就是图中的第二列;obj_class结构体里面存放的isa指针即指向了它的元类,也就是第三列;第三列的所有元类都指向了上帝类NSObject的元类(meta)。从图上上帝类NSObject的元类最后又指向了NSObject这个类本身,所以构成了一个回路。

#import 
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        //instacne-isKindOfClass
        Person *person = [[Person alloc] init];
        BOOL res1 = [[NSObject class] isKindOfClass:[NSObject class]];
        BOOL res3 = [[Person class] isKindOfClass:[Person class]];
        BOOL res10 = [[NSString class] isKindOfClass:[NSObject class]];
        
        NSLog(@"%d %d %d",res1, res3, res10);
                
        BOOL res5 = [[Person class] isKindOfClass:[NSObject class]];
        BOOL res6 = [person isKindOfClass:[NSObject class]];
        NSLog(@"%d %d", res5, res6);
        
        //instance-isMemberOfClass
        BOOL res2 = [[NSObject class] isMemberOfClass:[NSObject class]];
        BOOL res7 = [person isMemberOfClass:[NSObject class]];
        BOOL res8 = [[Person class] isMemberOfClass:[NSObject class]];
        BOOL res9 = [person isMemberOfClass:[Person class]];
        NSLog(@"%d %d %d %d" ,res2, res7, res8, res9);
        
    }
        return 0;
}
iskindofclass和ismemberofclass[77540:8188373] 1 0 1
iskindofclass和ismemberofclass[77540:8188373] 1 1
iskindofclass和ismemberofclass[77540:8188373] 0 0 0 1

res1从NSObject类的元类沿着superClass方向查找判断与NSObject类是否相等,NSObject的元类最后会指向NSObject类的本身与对比类相等,输出1。 

res3从Person类的元类沿着superClass方向查找判断与Person类是否相等,从Person的元类到NSObject的元类再到NSObject类没有与对比类相等,输出0。

res10从NSString类的元类沿着superClass方向查找判断与NSObject类是否相等,从NSString的元类到NSObject的元类再到NSObject类,有与对比类相等。输出1。

res5从Person类的元类沿着superClass方向查找判断与NSObject类是否相等,从Person的元类到NSObject的元类再到NSObject类,有与对比类相等,输出1。

res6从person对象所属的Person类沿着superClass方向查找判断与NSObject类是否相等,从Person类到NSObject类有与对比类相等 ,输出1。

res2会判断NSObject类的元类与NSObject类是否相等,不相等输出0。

res7会判断person对象所属的Person类与NSObject类是否相等,不相等输出0。

res8会判断Person类的元类与NSObject类是否相等,不相等输出0。

res9会判断person对象所属的Person类与Person类是否相等,相等输出1。

你可能感兴趣的:(ios,objective-c,xcode)