对OC中类的理解(一)

以前的博客网站使用的是Amazon的EC2,后来由于一些原因,被废掉了,里面的东西也丢了,很惨的是,我也没备份。现在直接用jekyll,不想再像以前一样去管理博客网站了。

1 id类型

我觉得想要理解OC中的类,首先要一步一步来,我们先理解什么是id类型。 我们知道id类型是一个通用的对象类型,它可以指向任何OC中的对象.它的结构大致为这样

typedef struct objc_class
{
   Class isa;
} *id;

这个读“is a”指针,它可以指向任何OC中的对象。它定义了对象所属的类。

People *_people = [[People alloc] init];
if ([_people isMemberOfClass:[People class]])
{
    NSLog(@"people isMemberOfClass People");
}

上面这个例子说明了isa指针的作用,同时我们也明白了isMemberOfClass这个方法的实现原理。

2 Class对象的定义

OC中Class对象的定义在objc/runtime.h里面可以找到。如下
:

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;

我们可以看到,在OC2里面,很多东西被废了,但是我们依然可以有借鉴意义(毕竟咱也没源码)。 在objcclass的结构体里面,第一个就是isa指针,这说明这个Class本身也是OC中的对象。里面第二个就是superclass,它指向了父类。那么结合isa指针和super_class指针,我们就可以明白isKindOfClass的实现方式。 那么这边isa指针所指向的类究竟是什么呢,这个应该是一个metaclass,或者叫元类,元类用来表述类本身所具有的元数据。类方法什么的也定义在这个地方。 那么类对象,也就是类的实例,他们都有且仅有一个与之相关的元类。大家可以参考下面的图进行理解:

image

上图中的SomeClass是继承自NSObject。Super_class指针描述了继承关系,isa指针描述了实例所属的类。

Article Published in on iOS

Article by 付军