Runtime of Objective-C 2-理解oc中的類和對象

來源:互聯網
上載者:User

標籤:style   blog   color   使用   io   strong   資料   for   

 

1: 類Class:
       typedef struct objc_class * Class;
     從Class的定義可以看出,它是一個 objc_class 結構類型的指標,objc_class又是什麼呢?
   

struct objc_class{    struct objc_class* isa;    struct objc_class* super_class;  //root的為null    const char* name;    long version;    long info;    long instance_size;    struct objc_ivar_list* ivars;  //執行個體變數    struct objc_method_list** methodLists;  //方法列表    struct objc_cache* cache;     //緩衝最近使用的方法,以提高效率;    struct objc_protocol_list* protocols;};

 

      為什麼Class的第一個成員也是Class呢,它的記憶體布局豈不是和底下的object一樣了?其實這就是類對象(class object)與執行個體對象(instance object)的區別了。
      Object-C對類對象與執行個體對象中的 isa 所指向的類結構作了不同的命名:類對象中的 isa 指向類結構被稱作 metaclass,metaclass 儲存類的static類成員變數與static類成員方法(+開頭的方法);執行個體對象中的 isa 指向類結構稱作 class(普通的),class 結構儲存類的普通成員變數與普通成員方法(-開頭的方法).      注意:方法、屬性、和協議都儲存在類定義的可寫段中,這些資訊可以在運行時被改變,這也是分類的實現原理。ivar儲存在唯讀段,所以不能被修改,這是分類不能添加執行個體變數的原因。       下面這個例子列印NSObject能響應的選取器列表
void PrintObjectMethods(){    unsigned int count = 0;    Method *methods = class_copyMethodList([NSObject class], &count);    for (unsigned int i =0; i < count; ++i) {        SEL sel = method_getName(methods[i]);        const char *name = sel_getName(sel);        printf("%s\n",name);    }    free(methods);}

 


  
2:對象id:
     typedef struct objc_object {         Class isa;     } *id;

 

    可以發現, id可以用來表示任意一個對象,它是一個 objc_object 結構類型的指標,其第一個成員是一個 objc_class 結構類型的指標。
    我們的根類NSObject也同樣是只有一個Class成員:
   @interface NSObject <NSObject> {
       Class       isa;
    }
    這個isa到底是什麼呢?官方介紹是這樣的:
    Every object is connected to the run-time system through its  isa instance variable, inherited from the NSObject class.  isaidentifies the object‘s class; it points to a structure that‘s compiled from the class definition. Through  isa, an object can find whatever information it needs at run timesuch as its place in the inheritance hierarchy, the size and structure of its instance variables, and the location of the method implementations it can perform in response to messages.
    可見,一個對象(Object)的isa指向了這個對象的類(Class),而這個對象的類(Class)的isa指向了metaclass。這樣我們就可以找到靜態方法和變數了。

3: 運行時: 
     Objective-C的運行時是動態,它能讓你在運行時為類添加方法或者去除方法以及使用反射。這在其它語言是不多見的。
       

     類的執行個體對象的 isa 指向它的類;類的 isa 指向該類的 metaclass;     類的 super_class 指向其父類,如果該類為根類則值為 NULL;     metaclass 的 isa 指向根 metaclass,如果該 metaclass 是根 metaclass 則指向自身;     metaclass 的 super_class 指向父 metaclass,如果該 metaclass 是根 metaclass 則指向該 metaclass 對應的類;
     Object-C 為每個類的定義產生兩個 objc_class ,一個普通的 class,另一個即 metaclass。我們可以在運行期建立這兩個 objc_class 資料結構,然後使用 objc_addClass將 class 註冊到運行時系統中,以此實現動態地建立一個新的類。  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.