objc中类方法里的self指的是什么


所有转出“博客园”,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4121431.html

objc中类方法里的self指的是什么

  在objc中是可以在类方法中使用self这个关键字的,这一点和其他语言比较比较诡异,因为很容易导致混淆和失误。而一般在对象方法中使用self/this这个关键字往往指的是当前对象。那么在objc中的类方法中的self指的是什么呢,请看下面一段进行测试的代码:

#import 

@interface MyClass : NSObject
@end
@implementation MyClass
+ (void)show
{
    Class p1= self;
    Class p2= [MyClass class];
    NSString *re= p1==p2?@"YES":@"NO";
    NSLog(@"%@",re);
}
@end

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        [MyClass show];
        //得到结果为YES
    }
    return 0;
}

  通过以上代码可以得到以下信息:

  类方法中self是一个Class,而Class 是一个指向 objc_class 结构体类型的指针。objc_class就是Objective-C的类。它定义如下:

typedef struct objc_class *Class;

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

  可以发现Class给我们的是一个叫做isa的指针,那么isa是什么呢?继续查看Objective-C的类结构

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;

  可以发现isa指针指向类的“元类”(metaclass),类型也是一个对象,我更喜欢把它叫做类型对象与之相对的就是熟悉的实例对象。正如对象可以接收的信息由类定义一样,类需要的信息就是由“元类”定义。值得指明的是Objective-C类也是对象。千万不要把isa和super_class弄混淆了。元类只跟发往类的消息有关,跟类的实例没有关系。可以观察到instance_size这样的信息,它定义了类的实例的尺寸,当实例化一个类的时候它就负责确保足够的内存空间。

  那么我们也清楚了类方法中的self是什么了,它等价于调用[类 Class],Class又返回给我们isa指针,isa是指向类型对象的。类型对象是这个的信息它只有一份。可以得到结论:类方法中的self是当前类的类型对象

欢迎各位朋友指正错误,以免误人子弟。