1、运行期如何知道某个对象的类型?
在运行期检查对象类型 这一操作叫做 类型查询 也叫 内省。
OC对象所用的数据结构定义在运行期程序的头文件中。
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
每个对象结构体的首个成员是Class类的变量,该变量定了类所属的类。
Class对象也在运行期程序头文件中:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
次结构存放累的“元数据”:如方法列表、实例变量列表、协议列表等。结构体的首个变量也是Class isa指针,说明Class本身也是OC对象。super_class:超类。类对象所属的类型是另一个类,叫做“元类”,类方法就定义在此。
类对象是单例,每个类的Class仅有一个实例
NSObject class -----> NSObject metaClass
^ superclass ^ superclass
isa | isa |
SomeClass instance -----> SomeClass class -----> SomeClass metaClass
2、在类继承体系中查询类型信息
//是否为特定类的实例
- (BOOL)isMemberOfClass:(Class)aClass;
//是否为某类或其派生的实例,使用isa在类的继承体系中游走
- (BOOL)isKindOfClass:(Class)aClass;