iOS開發-底層篇-Class詳解,ios底層-class詳解

來源:互聯網
上載者:User

iOS開發-底層篇-Class詳解,ios底層-class詳解

前言:iOS的開發語言objective-c,它的真實面目是它不是真正的物件導向語言,而抽象理解為此而已。其實它就是C+,有個公式可以很好地詮釋那就是

OC = C + Runtime; 接下來我們就好好講講在Runtime下的objc-class。準備資料,objc4-646/runtime。

一:Class定義

    1.1 小小說明一下objc-api.h裡的OBJC_ISA_AVAILABILITY:

/*介紹一下__attribute__((deprecated))的作用,__attribute是給函數、變數、類做屬性說明的關鍵字,deprecated是棄用原先的進行相容

  若是__OBJC2__,原先的類,編譯器發出警告*/

#if !defined(OBJC_ISA_AVAILABILITY)#   if __OBJC2__#       define OBJC_ISA_AVAILABILITY  __attribute__((deprecated))#   else#       define OBJC_ISA_AVAILABILITY  /* still available */#   endif#endif

 

 

typedef struct objc_method *Method;typedef struct objc_ivar *Ivar;typedef struct objc_category *Category;typedef struct objc_property *objc_property_t;

 

 

    1.2 接下來就是runtime.h裡的Class的定義:

struct objc_class {    Class isa  OBJC_ISA_AVAILABILITY;//每個Class都有一個isa指標    #if !__OBJC2__    Class super_class                                        OBJC2_UNAVAILABLE;//父類    const char *name                                         OBJC2_UNAVAILABLE;//類名    long version                                             OBJC2_UNAVAILABLE;//類版本    long info                                                OBJC2_UNAVAILABLE;//!*!供運行期使用的一些位標識。如:CLS_CLASS (0x1L)表示該類為普通class; CLS_META(0x2L)表示該類為metaclass等(runtime.h中有詳細列出)    long instance_size                                       OBJC2_UNAVAILABLE;//執行個體大小    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;//儲存每個執行個體變數的記憶體位址    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;//!*!根據info的資訊確定是類還是執行個體,運行什麼函數方法等    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;//緩衝    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;//協議#endif    } OBJC2_UNAVAILABLE;

 

 

 

 

二:class初始化

    Runtime的行為之一就是initialize。在程式運行過程中,它會在你程式中每個類調用一次initialize。這個調用的時間發生在你的類接收到訊息之前,但是在它的超類接收到initialize之後。

//在蘋果的官方Runtime中有個objc-initialize.m檔案,進行解讀typedef struct _objc_initializing_classes {    int classesAllocated;//類是否分配存在    Class *metaclasses;//類的父類,如果沒有父類那就是自身} _objc_initializing_classes;//初始化一個對象_objc_initializing_classes//將所有的類儲存在靜態鏈表中,以待接下來的接收和發送訊息static _objc_initializing_classes *_fetchInitializingClassList(BOOL create){    _objc_pthread_data *data;    //list為類鏈表    _objc_initializing_classes *list;    Class *classes;        data = _objc_fetch_pthread_data(create);    if (data == nil) return nil;        //鏈表增加類節點    list = data->initializingClasses;    if (list == nil) {        if (!create) {            return nil;        } else {            list = (_objc_initializing_classes *)            _calloc_internal(1, sizeof(_objc_initializing_classes));            data->initializingClasses = list;        }    }    //將建立的classes接在metaclasses後    classes = list->metaclasses;    if (classes == nil) {        // If _objc_initializing_classes exists, allocate metaclass array,        // even if create == NO.        // Allow 4 simultaneous class inits on this thread before realloc.        list->classesAllocated = 4;        classes = (Class *)        _calloc_internal(list->classesAllocated, sizeof(Class));        list->metaclasses = classes;    }    return list;}

 

 

三.runtime下Class的各項操作(重要幾個)

    

3.1 add*(增加)        3.1.1 static IMP addMethod(Class cls, SEL name, IMP imp, const char *types, BOOL replace);//增加方法        3.1.2 BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);//增加類方法        3.1.3 BOOL class_addIvar(Class cls, const char *name, size_t size,uint8_t alignment, const char *type);//增加執行個體變數        3.1.4 static BOOL _class_addProperty(Class cls, const char *name,const objc_property_attribute_t *attrs, unsigned int count,BOOL replace);//增加屬性    3.2 replace*(修改)        3.2.1 IMP class_replaceMethod(Class cls, SEL name, IMP imp, const char *types); //修改方法        3.2.2 void class_replaceProperty(Class cls, const char *name,const objc_property_attribute_t *attrs, unsigned int n);//修改屬性    3.3 get*(擷取)        3.3.1 static Class getClass(const char *name);//擷取類        3.3.2 static ivar_t *getIvar(Class cls, const char *name);//擷取類變數(static相當於“+“)        3.3.3 Method class_getInstanceMethod(Class cls, SEL sel);//擷取執行個體方法        3.3.4 static Method _class_getMethod(Class cls, SEL sel);;//擷取類方法        3.3.5 static Protocol *getProtocol(const char *name);//增加協議    3.4 set*(設定)        3.4.1 objc_class::setInitialized();//set的initialized初始化        3.4.2 static Class setSuperclass(Class cls, Class newSuper);//設定父類    3.5 其他還有類似於 void *objc_destructInstance(id obj);//摧毀執行個體對象等等

 

 

四.Class的重要函數

   

4.1 get*(擷取)        4.1.1 object_getClass(id obj);        4.1.2 IMP object_getMethodImplementation(id obj, SEL name);//獲得執行個體方法實現        4.1.3 Ivar object_getInstanceVariable(id obj, const char *name, void **value)//擷取執行個體屬性    4.2 set*(設定)        4.2.1 Class object_setClass(id obj, Class cls);        4.2.2 Ivar object_setInstanceVariable(id obj, const char *name, void *value);//設定執行個體屬性        4.2.3 void object_setIvar(id obj, Ivar ivar, id value);//設定執行個體變數    4.3 其他        4.3.1 static void _class_resolveClassMethod(Class cls, SEL sel, id inst);//動態添加類方法,不必在乎方法是否存在        4.3.2 static void _class_resolveInstanceMethod(Class cls, SEL sel, id inst);//動態添加實現方法,不必在乎方法是否存在        4.3.3 unsigned _class_createInstancesFromZone(Class cls, size_t extraBytes, void *zone,id *results, unsigned num_requested);//建立執行個體儲存空間    4.4 訊息轉寄        4.4.1 void    instrumentObjcMessageSends(BOOL flag);//flag傳入YES,運行時發送的所有訊息都會列印到/tmp/msgSend-xxxx檔案裡了。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.