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

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

Objective-C總Runtime的那點事兒(一)消息機制【轉】

2019-11-14 17:56:12
字體:
來源:轉載
供稿:網友

RunTime簡稱運行時。就是系統在運行的時候的一些機制,其中最主要的是消息機制。對于C語言,函數的調用在編譯的時候會決定調用哪個函數( C語言的函數調用請看這里 )。編譯完成之后直接順序執行,無任何二義性。OC的函數調用成為消息發送。屬于動態調用過程。在編譯的時候并不能決定真正調用哪個函數(事實證明,在編 譯階段,OC可以調用任何函數,即使這個函數并未實現,只要申明過就不會報錯。而C語言在編譯階段就會報錯)。只有在真正運行的時候才會根據函數的名稱找 到對應的函數來調用。

那OC是怎么實現動態調用的呢?下面我們來看看OC通過發送消息來達到動態調用的秘密。假如在OC中寫了這樣的一個代碼:

1
[obj makeText];

其中obj是一個對象,makeText是一個函數名稱。對于這樣一個簡單的調用。在編譯時RunTime會將上述代碼轉化成

1
objc_msgSend(obj,@selector(makeText));

首先我們來看看obj這個對象,iOS中的obj都繼承于NSObject。

1
2
3
@interface NSObject <nsobject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}</nsobject>

在NSObjcet中存在一個Class的isa指針。然后我們看看Class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct objc_class *Class;
struct objc_class {
  Class isa; // 指向metaclass
   
  Class super_class ; // 指向其父類
  const char *name ; // 類名
  long version ; // 類的版本信息,初始化默認為0,可以通過runtime函數class_setVersion和class_getVersion進行修改、讀取
  long info; // 一些標識信息,如CLS_CLASS (0x1L) 表示該類為普通 class ,其中包含對象方法和成員變量;CLS_META (0x2L) 表示該類為 metaclass,其中包含類方法;
  long instance_size ; // 該類的實例變量大小(包括從父類繼承下來的實例變量);
  struct objc_ivar_list *ivars; // 用于存儲每個成員變量的地址
  struct objc_method_list **methodLists ; // 與 info 的一些標志位有關,如CLS_CLASS (0x1L),則存儲對象方法,如CLS_META (0x2L),則存儲類方法;
  struct objc_cache *cache; // 指向最近使用的方法的指針,用于提升效率;
  struct objc_PRotocol_list *protocols; // 存儲該類遵守的協議
    }

 

我們可以看到,對于一個Class類中,存在很多東西,下面我來一一解釋一下:

Class isa:指向metaclass,也就是靜態的Class。一般一個Obj對象中的isa會指向普通的Class,這個Class中存儲普通成員變量和對 象方法(“-”開頭的方法),普通Class中的isa指針指向靜態Class,靜態Class中存儲static類型成員變量和類方法(“+”開頭的方 法)。

Class super_class:指向父類,如果這個類是根類,則為NULL。

下面一張圖片很好的描述了類和對象的繼承關系:

iuqQFnm.png

注意:所有metaclass中isa指針都指向跟metaclass。而跟metaclass則指向自身。Root metaclass是通過繼承Root class產生的。與root class結構體成員一致,也就是前面提到的結構。不同的是Root metaclass的isa指針指向自身。

Class類中其他的成員這里就先不做過多解釋了,下面我們來看看:

@selector (makeText):這是一個SEL方法選擇器。SEL其主要作用是快速的通過方法名字(makeText)查找到對應方法的函數指針,然后調用其函 數。SEL其本身是一個Int類型的一個地址,地址中存放著方法的名字。對于一個類中。每一個方法對應著一個SEL。所以iOS類中不能存在2個名稱相同 的方法,即使參數類型不同,因為SEL是根據方法名字生成的,相同的方法名稱只能對應一個SEL。

下面我們就來看看具體消息發送之后是怎么來動態查找對應的方法的。

首先,編譯器將代碼[obj makeText];轉化為objc_msgSend(obj, @selector (makeText));,在objc_msgSend函數中。首先通過obj的isa指針找到obj對應的class。在Class中先去cache中 通過SEL查找對應函數method(猜測cache中method列表是以SEL為key通過hash表來存儲的,這樣能提高函數查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,則取superClass中查找。若能找到,則將method加 入到cache中,以方便下次查找,并通過method中的函數指針跳轉到對應的函數中去執行。


上一篇:IOS圖片全屏預覽

下一篇:iOS內存管理

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩福利伦理影院免费| 国产精品国产自产拍高清av水多| 欧美另类暴力丝袜| 国产精品入口夜色视频大尺度| 久久影视电视剧凤归四时歌| 日韩理论片久久| 最近日韩中文字幕中文| 久久人人爽亚洲精品天堂| 国产裸体写真av一区二区| 亚洲欧洲xxxx| 成人字幕网zmw| 国产精品91久久久| 久久成人这里只有精品| 91免费看片网站| 久久久国产精彩视频美女艺术照福利| 精品国产91久久久久久| 青青草精品毛片| 久久综合久久美利坚合众国| 日韩欧美国产骚| 久久99久久久久久久噜噜| 色综合91久久精品中文字幕| 国产精品久久久久久久久久ktv| 亚洲欧洲日产国码av系列天堂| 国内成人精品视频| 欧美成年人视频| 91免费人成网站在线观看18| 色多多国产成人永久免费网站| 乱亲女秽乱长久久久| 一本色道久久88亚洲综合88| 日韩欧美在线一区| 精品久久久久久国产91| 日韩欧美在线网址| 久久国产精品影视| 日韩欧亚中文在线| 日韩欧美a级成人黄色| 最近2019中文字幕大全第二页| 福利精品视频在线| 国产精品偷伦视频免费观看国产| 成人网页在线免费观看| 78m国产成人精品视频| 国产欧美 在线欧美| 欧美成年人在线观看| 欧美成人一区在线| 爱福利视频一区| 欧美重口另类videos人妖| 欧美中文字幕在线视频| 91久久中文字幕| 91久久国产婷婷一区二区| 热99精品只有里视频精品| 国产九九精品视频| 亚洲女在线观看| 91精品国产自产在线观看永久| 国产精品入口日韩视频大尺度| 一区二区三区无码高清视频| 欧美日韩国产成人| 一区二区三区视频免费| 亚洲乱码国产乱码精品精天堂| 日韩色av导航| 国内精品视频一区| 91色精品视频在线| 日韩乱码在线视频| 国产成人久久精品| 日韩在线视频免费观看| 国产91精品青草社区| 日本一区二区在线播放| 国产一区二区三区在线播放免费观看| 中文字幕日韩精品在线观看| 性欧美亚洲xxxx乳在线观看| 九九久久久久久久久激情| 欧美亚洲另类在线| 欧美精品第一页在线播放| 精品国产乱码久久久久久虫虫漫画| 国产精品成人aaaaa网站| 亚洲缚视频在线观看| 日本伊人精品一区二区三区介绍| 国产精品ⅴa在线观看h| 在线丨暗呦小u女国产精品| 亚洲精品在线视频| 色综合影院在线| 日日摸夜夜添一区| 亚洲高清不卡av| 国产午夜精品理论片a级探花| 国产精品十八以下禁看| 九九九久久久久久| 两个人的视频www国产精品| 97国产精品久久| 日韩一区二区在线视频| 国产成人精品免高潮费视频| 欧美电影免费观看电视剧大全| 日韩免费在线看| 最近更新的2019中文字幕| 色婷婷亚洲mv天堂mv在影片| 日韩av毛片网| 日本久久久久亚洲中字幕| 亚洲美女性生活视频| 欧美日韩国内自拍| 国产xxx69麻豆国语对白| 26uuu久久噜噜噜噜| 免费99精品国产自在在线| 亚洲成av人影院在线观看| 久久天天躁狠狠躁夜夜躁2014| 国产精品久久久久久久久久久久久| 久久久久国产视频| 亚洲大胆人体av| 91av视频在线| 国产精品一区二区三| 日本高清不卡在线| 亚洲在线第一页| 国产精品老牛影院在线观看| 欧美一区二区三区四区在线| 欧美一区二区三区……| 国产精品高潮呻吟久久av无限| 一个人看的www久久| 欧美黑人狂野猛交老妇| 欧美精品成人91久久久久久久| 成人免费网站在线| 久久视频国产精品免费视频在线| 成人精品一区二区三区| 91久久久久久久| 欧美在线视频一区二区| 美女精品视频一区| 日韩精品视频在线观看免费| 国产精品96久久久久久又黄又硬| 亚洲成人国产精品| 亚洲第一区第一页| 日韩视频免费大全中文字幕| 91精品国产99久久久久久| 成人乱色短篇合集| 国产精品jvid在线观看蜜臀| 精品久久久香蕉免费精品视频| 成人久久一区二区三区| 日韩欧美在线国产| 亚洲人成绝费网站色www| 欧美精品制服第一页| 日韩国产一区三区| 亚洲精选一区二区| 欧美在线视频播放| 日本精品久久久久久久| 久久久久久成人精品| 午夜精品在线视频| 亚洲的天堂在线中文字幕| 久久久久久久久久久免费| 国产综合福利在线| 欧美日韩综合视频| 庆余年2免费日韩剧观看大牛| 亚洲男女自偷自拍图片另类| 自拍偷拍免费精品| 国产精品久久久久久婷婷天堂| 97免费在线视频| 中文字幕不卡在线视频极品| 亚洲无亚洲人成网站77777| 国产精品福利在线观看| 国产国产精品人在线视| 中文字幕日韩av电影| 欧美国产日韩xxxxx| 久久久精品美女| 亚洲成人激情小说| 色综合久久88| 精品一区电影国产| 久久亚洲国产成人| 国产精品www网站| 日韩欧美在线播放| www亚洲欧美| 国产精品久久久久久久久久尿|