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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

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

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

#import<Foundation/Foundation.h>@interfaceMyClass : NSObject@end@implementationMyClass+ (void)show

{Classp1=self;Classp2= [MyClassclass];

NSString*re= p1==p2?@"YES":@"NO";

NSLog(@"%@",re);

}@endintmain(intargc,constchar*argv[])

{

@autoreleasepool {

[MyClass show];//得到结果为YES}return0;

}

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

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

typedefstructobjc_class *Class;structobjc_object {

Class isa OBJC_ISA_AVAILABILITY;

};

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

structobjc_class {

Class isa OBJC_ISA_AVAILABILITY;#if!__OBJC2__Class super_class OBJC2_UNAVAILABLE;constchar*name OBJC2_UNAVAILABLE;longversion OBJC2_UNAVAILABLE;longinfo OBJC2_UNAVAILABLE;longinstance_size OBJC2_UNAVAILABLE;structobjc_ivar_list *ivars OBJC2_UNAVAILABLE;structobjc_method_list **methodLists OBJC2_UNAVAILABLE;structobjc_cache *cache OBJC2_UNAVAILABLE;structobjc_PRotocol_list *protocols OBJC2_UNAVAILABLE;#endif} OBJC2_UNAVAILABLE;

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

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

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航