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);
}
@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是當前類的類型對象

歡迎各位朋友指正錯誤,以免誤人子弟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM