所有轉出“博客園”,請您注明出處:http://www.49028c.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是當前類的類型對象。
歡迎各位朋友指正錯誤,以免誤人子弟。
新聞熱點
疑難解答