美文网首页
isa与class经典问题

isa与class经典问题

作者: miaohy | 来源:发表于2020-09-16 15:10 被阅读0次
     BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];  
    //返回yes
    + (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    
    + (Class)class {
        return self;
    }
    

    上面为什么返回YES呢?[NSObject class] 返回类对象NSObject,NSObject调用isKindOfClass方法,首先是取到NSObject的元类与NSObject比较,不相等,然后取到NSObject元类的父类(NSObject元类的父类是NSObject)进行比较,相等。

    BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];  
    
    + (BOOL)isMemberOfClass:(Class)cls {
       return self->ISA() == cls;
    }
    

    上面返回NO,为啥呢?NSObject调用isMemberOfClass方法,取的NSObject的元类与NSObject比较不相等

    BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];       //
    

    上面返回NO,为啥呢?[LGPerson class] LGPerson类对象,调用isKindOfClass ,首先取LGPerson的元类与LGPerson比较发现不相等,然后再取LGPerson元类的父类(NSObject的元类)与LGPerson比较,也不相等,再取NSObject的元类的父类(NSObject)与LGPerson比较还不相等,再再然后取NSObject的父类位nil与LGPerson比较,也不相等,因为为nil所以跳出循环,最后返回NO

    BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]];     //
    

    上面返回NO,为啥呢?[LGPerson class] 返回LGPerson类对象,再调用isMemberOfClass,会拿LGPerson类对象的isa即元类与LGPerson类对象比较,所以不相等

     BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];   
    - (BOOL)isKindOfClass:(Class)cls {
        for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
            if (tcls == cls) return YES;
        }
        return NO;
    }
    - (Class)class {
        return object_getClass(self);
    }
    
    Class object_getClass(id obj)
    {
        if (obj) return obj->getIsa();
        else return Nil;
    } 
    

    上面为什么返回YES呢?[NSObject alloc]一个NSObject的实例对象,调用isKindOfClass,该方法首先通过 [self class]拿到NSObject的类对象,然后与传过来的类对象进行比较,两者相等

    BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
    - (BOOL)isMemberOfClass:(Class)cls {
        return [self class] == cls;
    }
    

    NSObject的实例对象调用isMemberOfClass,该函数是拿实例对象的class即类对象与[NSObject class]比较,所以相等

    BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]]; 
    BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];  ```
    //LGPerson的实例对象调用isMemberOfClass,该函数是拿实例对象的class即类对象与[LGPerson class]比较,所以相等
    

    相关文章

      网友评论

          本文标题:isa与class经典问题

          本文链接:https://www.haomeiwen.com/subject/fzocyktx.html