美文网首页
13.理解类对象的用意

13.理解类对象的用意

作者: 写代码写到人生巅峰 | 来源:发表于2017-05-06 10:28 被阅读0次

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;

相关文章

网友评论

      本文标题:13.理解类对象的用意

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