首页 > 代码库 > (原)objc中类方法里的self指的是什么

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

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

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

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

#import <Foundation/Foundation.h>@interface MyClass : NSObject@end@implementation MyClass+ (void)show{    Class p1= self;    Class p2= [MyClass class];    NSString *re= p1==p2?@"YES":@"NO";    NSLog(@"%@",re);}@endint 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是当前类的元类。

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

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