zoukankan      html  css  js  c++  java
  • 01-05 isKindOfClass与isMemberOfClass

    /// 类方法,返回自身
    + (Class)class {
      return self;
    }
    
    /// 实例方法,查找isa(此处返回类对象或者元类对象)
    - (Class)class {
       return object_getClass(self);
    }
    
    Class object_getClass(id obj){
       if (obj) return obj->getIsa();
       else return Nil;
    }
    
    inline Class objc_object::getIsa(){
       if (isTaggedPointer()) {
          uintptr_t slot = ((uintptr_t)this >> TAG_SLOT_SHIFT) & TAG_SLOT_MASK;
          return objc_tag_classes[slot];
       }
       return ISA();
    
    }
    
    inline Class objc_object::ISA(){
        assert(!isTaggedPointer());
        return (Class)(isa.bits & ISA_MASK);
    }
    
    // 当前类对象的ISA :元类 然后元类的:superclass 即判断cls 是不是当前类的元类或者元类的父类
    + (BOOL)isKindOfClass:(Class)cls {
      for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
         if (tcls == cls) return YES;
    
         }
       return NO;
    }
    
    // 当前实例对象的类对象 然后类对象的:superclass 即判断cls 是不是当前对象的的类对象或者类对象的父类
    - (BOOL)isKindOfClass:(Class)cls {
         for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
           if (tcls == cls) return YES;
         }
         return NO;
    }
    
    /// cls是不是当前类的元类对象
    
    + (BOOL)isMemberOfClass:(Class)cls {
         return self->ISA() == cls;
    }
    
    /// cls是不是当前类的类对象
    
    - (BOOL)isMemberOfClass:(Class)cls {
         return [self class] == cls;
    }
    

    
    - (void)testClassISA {
    
    id b1 = [NSObject class];
    
    id b2 = [NSObject class];
    
    id b3 = [[NSObject new] class];
    
    NSLog(@"[NSObject class] = %@ , %@, %@", b1,b2,b3);
    
    // true  
      /*
      self =  (id)[NSObject class]  类方法 返回自身
      cls  = [NSObject class] 类方法 返回自身
      【self isKindOfClass:cls】 即cls是不是self的元类或者元类的父类
      元类的基类是NSObject NSObject元类对象的父类是 NSObject类对象 所以为true
      */
    BOOL res1 = [(id)[NSObject class] isKindOfClass:(id)[NSObject class]];
    
    // false  + (BOOL)isMemberOfClass:(Class)cls    cls 是不是self的元类对象 ?
      //后面的(id)[NSObject class]  即 cls此时是类对象 而不是元类对象 故返回false
      /*
        self =  (id)[NSObject class]  类方法 返回自身 类对象
        cls  = [NSObject class] 类方法 返回自身 类对象
       【self isMemberOfClass:cls】 即求:cls是不是self的元类对象
        类对象 不等于 元类对象  false
      */
    BOOL res2 = [(id)[NSObject class] isMemberOfClass:(id)[NSObject class]];
    
    // true  cls是不是self的元类对象或者元类对象的父类
      /*
      a = [[NSObject new] class] 类对象
      b = [NSObject class] 类对象
     [a isKindOfClass:b】 b是不是a的元类类对象或者元类类对象的父类 true
      */
    BOOL res3 = [(id)[[NSObject new] class] isKindOfClass:(id)[NSObject class]];
    
    // false  + (BOOL)isMemberOfClass:(Class)cls  cls是不是self的类对象
       /*
      a = [[NSObject new] class] 类对象
      b = [NSObject class] 类对象
     [a isMemberOfClass:b】 b是不是a的元类对象 false
      */
    BOOL res4 = [(id)[[NSObject new] class] isMemberOfClass:(id)[NSObject class]];
    
    // true
       /*
      a = [[NSObject new] class] 类对象
      b = [NSObject class] 类对象
     [a isKindOfClass:b】 b是不是a的元类对象 或者元类对象的父类 
      */
    BOOL res5 = [(id)[[NSObject new] class] isKindOfClass:(id)[NSObject class]];
    
    // false
       /*
      a = [[NSObject new] class] 类对象
      b = [NSObject class] 类对象
     [a isMemberOfClass:b】 b是不是a的元类对象 
      */
    BOOL res6 = [(id)[[NSObject new] class] isMemberOfClass:(id)[NSObject class]];
    
    // false (id)[Test class] 是不是[(id)[Test class]的元类对象 或者它父类的元类对象
    BOOL res7 = [(id)[Test class] isKindOfClass:(id)[Test class]];
    
    // false   (id)[Test class] 是不是[(id)[Test class]的元类对象 
    BOOL res8 = [(id)[Test class] isMemberof:(id)[Test class]];
    
    // false    (id)[Test class] 是不是[(id)[Test class]的元类对象  或者它父类的元类对象
    BOOL res9 = [(id)[[Test new] class] isKindOfClass:(id)[Test class]];
    
    // false    (id)[Test class] 是不是[(id)[Test class]的元类对象 
    BOOL res10 = [(id)[[Test new] class] isMemberOfClass:(id)[Test class]];
    
    // true      [Test class]是不是[Test new]的类对象 或者类对象的父类
    BOOL res11 = [(id)[Test new] isKindOfClass:(id)[Test class]];
    
    // true   [Test class]是不是[Test new]的类对象
    BOOL res12 = [(id)[Test new] isMemberOfClass:(id)[Test class]];
    
    // 1, 0, 1, 0, 1, 1
    NSLog(@"%d, %d, %d, %d, %d, %d",res1, res2, res3,res4,res5, res6);
    
    // 0, 0, 0, 0, 1, 1
    NSLog(@"%d, %d, %d, %d, %d, %d",res7, res8, res9,res10,res11, res12);
    
    }
    
    
    
  • 相关阅读:
    [C#] 走进异步编程的世界
    [C#] C# 知识回顾
    [C#] 走进异步编程的世界
    [C#] 走进异步编程的世界
    [.Net] 手把手带你将自己打造的类库丢到 NuGet 上
    [.NET] WebApi 生成帮助文档及顺便自动创建简单的测试工具
    [C#] Linq To Objects
    [C#] Linq To Objects
    T-SQL:毕业生出门需知系列(九)
    TortoiseGit:记住用户名和密码
  • 原文地址:https://www.cnblogs.com/xiaowuqing/p/14028141.html
Copyright © 2011-2022 走看看