博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

01-05 isKindOfClass与isMemberOfClass

Posted on 2020-11-24 00:22  肖无情  阅读(73)  评论(0编辑  收藏  举报
/// 类方法,返回自身
+ (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);

}