iOS 中内省的几个方法?class方法和objc_getClass方法有什么区别?

内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别。
明智地使用内省可以使面向对象的程序更加高效和强壮。它有助于避免错误地进行消息派发、错误地假设对象相等、以及类似的问题。

iOS 中内省的几个方法

  • 判断对象类型:
    -(BOOL) isKindOfClass: 判断是否是这个类或者这个类的子类的实例
    -(BOOL) isMemberOfClass: 判断是否是这个类的实例
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}

- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}
  • 判断对象or类是否有这个方法
    -(BOOL) respondsToSelector: 判读实例是否有这样方法
    +(BOOL) instancesRespondToSelector: 判断类是否有这个方法

class方法和objc_getClass方法有什么区别

  • object_getClass:获得的是isa的指向,比如:实例对象的isa是类对象,类对象的isa是元类对象。
  • self.class:当self是实例对象的时候,返回的是类对象,否则则返回自身。类方法class,返回的是self,所以当查找meta class时,需要对类对象调用object_getClass方法。
+ (Class)class {
    return self;
}

- (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);
}

参考:
object_getClass(obj)与[obj class]的区别
iOS 中内省的几个方法?class方法和objc_getClass方法有什么区别
Objective-C Runtime 入院第一天—— isa 和 Class

你可能感兴趣的:(iOS 中内省的几个方法?class方法和objc_getClass方法有什么区别?)