亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發-底層篇-Class詳解

2019-11-14 19:38:00
字體:
來源:轉載
供稿:網友

前言: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文件里了。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费国产网站| 欧美一区二粉嫩精品国产一线天| 亚洲性xxxx| 51午夜精品视频| 欧美最猛性xxxxx(亚洲精品)| 国产丝袜一区二区三区| 麻豆成人在线看| 国产精品96久久久久久又黄又硬| 国内精品久久久久久| 综合国产在线观看| 国产精品久久久久秋霞鲁丝| 91av在线免费观看| 亚洲国产又黄又爽女人高潮的| 久久男人av资源网站| 在线成人一区二区| 精品美女国产在线| 日本一区二三区好的精华液| 日韩中文字幕不卡视频| 青青草精品毛片| 日韩大片免费观看视频播放| 九九久久精品一区| 怡红院精品视频| 成人av在线网址| 精品国产欧美一区二区五十路| 91免费高清视频| 97国产一区二区精品久久呦| 亚洲精品视频在线播放| 国产一区二区三区在线观看视频| www.国产精品一二区| 欧美日韩另类在线| 欧美高清电影在线看| 久久久久久国产精品三级玉女聊斋| 日韩一区视频在线| 91wwwcom在线观看| 亚洲欧洲日韩国产| 精品国产一区二区三区久久狼黑人| 都市激情亚洲色图| 成人天堂噜噜噜| 亚洲精品国精品久久99热| 色99之美女主播在线视频| 欧美激情视频网| 亚洲精品美女久久久久| 国产成人精彩在线视频九色| 在线色欧美三级视频| 欧美精品成人在线| 亚洲成人av在线| 亚洲一级黄色av| 亚洲影视中文字幕| 亚洲va欧美va国产综合剧情| 亚洲精品美女网站| 欧美成人h版在线观看| 欧美日韩亚洲激情| 91久久在线视频| 国产成人免费91av在线| 91在线免费看网站| 亚洲久久久久久久久久久| 国产精品精品一区二区三区午夜版| 国产va免费精品高清在线| 91亚洲精品在线观看| 在线成人激情视频| 91亚洲精品久久久| 欧美黄色成人网| 亚洲欧美另类国产| 亚洲大胆美女视频| 色琪琪综合男人的天堂aⅴ视频| 亚洲欧美日韩成人| 久久精品中文字幕免费mv| 亚洲视频视频在线| 国产福利视频一区| 精品高清美女精品国产区| 成人精品一区二区三区电影免费| 91精品视频免费看| 中文字幕成人在线| 久久国产精品网站| 欧美国产日韩视频| 亚洲人成在线一二| 亚洲人成啪啪网站| 国产精品99久久久久久久久久久久| 欧美www视频在线观看| 久久亚洲一区二区三区四区五区高| 久久人人97超碰精品888| 亚洲天堂色网站| 亚洲www永久成人夜色| 欧美一区深夜视频| 91亚洲精品视频| 都市激情亚洲色图| 亚洲国产精品99| 欧美xxxx做受欧美.88| 日本中文字幕不卡免费| 国产视频综合在线| 91精品国产99久久久久久| 美女啪啪无遮挡免费久久网站| 日韩精品免费电影| 亚洲精品成人久久电影| 久久精彩免费视频| 欧美日韩在线免费观看| 亚洲日韩欧美视频一区| 欧美成人免费va影院高清| 欧美福利视频网站| 国内久久久精品| 欧美一级高清免费| 欧美性感美女h网站在线观看免费| 欧美大片va欧美在线播放| 啪一啪鲁一鲁2019在线视频| 中文字幕亚洲天堂| 色综合伊人色综合网站| 538国产精品一区二区在线| 2025国产精品视频| 国产在线久久久| 中文字幕精品在线视频| 欧美人成在线视频| 欧美性资源免费| 日韩在线www| 亚洲深夜福利网站| 91超碰caoporn97人人| 国产精品久久久久av| 日韩av免费在线看| 狠狠躁夜夜躁人人爽超碰91| 欧美性xxxx极品hd欧美风情| 成人黄色在线观看| 国产97在线观看| 久久精品中文字幕一区| 性色av一区二区三区在线观看| 欧美日韩国产一区二区| 在线精品视频视频中文字幕| 国内精品免费午夜毛片| 国产亚洲欧洲黄色| 国产一区欧美二区三区| 91午夜理伦私人影院| 亚洲精品国产精品乱码不99按摩| 国内精品视频久久| 久久久久久久久久久久av| 国语自产精品视频在线看一大j8| 国产精品久久视频| 亚洲成人a**站| 欧美成在线观看| 国产精品日韩电影| 日韩在线精品一区| 伊是香蕉大人久久| 日韩在线免费观看视频| 伊人av综合网| 色狠狠av一区二区三区香蕉蜜桃| 欧美高清在线视频观看不卡| 亚洲石原莉奈一区二区在线观看| 亚洲tv在线观看| 国产精品女人久久久久久| 国内免费精品永久在线视频| 久久久久中文字幕| 91在线观看免费观看| 亚洲精品国产精品国自产观看浪潮| 欧美性猛交视频| 国产99久久精品一区二区永久免费| 欧美一区三区三区高中清蜜桃| 欧美综合一区第一页| 亚洲精品国产拍免费91在线| 日韩a**站在线观看| 中文字幕亚洲一区| 亚洲欧美三级伦理| 日韩av影院在线观看| 久久久久国产精品一区| 欧美日韩日本国产| 亚洲精品福利在线观看| 亚洲欧美日本精品| 91免费看片网站|