日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一、Objective-C之Runtime的概念

發布時間:2023/12/2 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一、Objective-C之Runtime的概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前一篇關于NSProxy代理涉及到的關于消息轉發,把以前寫的runtime文章從github上轉移過來。一共三篇,似乎自己也忘記了一些runtime的細節,需要溫故一下。

一、什么是Objc的Runtime?

Runtime是Objc語言的磐石,Objc語言得以運行,也是依靠runtime庫的支持。

Objc語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態語言的優勢在于:我們寫代碼時能夠更具靈活性,如我們可以把消息轉發給我們想要的對象,或者隨意交換一個方法的實現等。這種特性意味著Objc不僅需要一個編譯器,還需要一個運行時系統來執行編譯的代碼。對于Objc來說,這個運行時系統就像一個操作系統一樣:它讓所有的工作可以正常的運行,這個運行時系統即Objc Runtime。

Runtime基本上是用C和匯編寫的,這個庫使得C語言有了面向對象的能力。在這個庫中,對象可以用C語言中的結構體表示,而方法可以用C函數來實現,再加上了一些額外的特性。這些結構體和函數被runtime函數封裝后,我們就可以在程序運行時創建,檢查,修改類、對象和它們的方法了。runtime可以有效的幫助我們為程序增加很多動態的行為。

二、Runtime中的重要概念

先看一句最常見的方法調用代碼:[receiver message];

剛開始學習Objc時,覺得上面的方法就是調用receiver對象的message方法。這樣的理解也沒錯。更底層的原理應該是這樣的:

向receiver對象發送消息,上面的代碼會被編譯器轉成:

objc_msgSend(receiver, selector)

如果含有多個參數則是:

objc_msgSend(receiver, selector, arg1, arg2, ...)

如果消息的接收者receiver能夠找到對應的selector,那就執行接收者receiver的這個message方法。否則消息將被轉發,或臨時動態的向接收者receiver添加這個selector的實現,或者直接崩潰。

至此,知道了編譯階段只是知道了向receiver對象發送了這樣一個消息,至于消息能否被響應,需要等到運行時的具體情況決定。由此看出Objc的Runtime鑄就了它動態語言的特性。

大部分情況下你就只管寫你的Objc代碼就行,runtime系統自動在幕后辛勤勞作著。消息的執行會使用到一些編譯器為實現動態語言特性而創建的數據結構和函數,Objc中的類、方法和協議等在runtime中都由一些數據結構來定義。


三、梳理objc_msgSend

方法原型是:id objc_msgSend(id self, SEL op, ...)。

id

id是指向類實例的結構體指針。定義如下:

typedef struct objc_object *id;

id這個結構體的定義本身就帶了一個*號, 所以我們在使用其他NSObject類型的實例時需要在前面加上*, 而使用id時卻不用。

接著,我們發現一個objc_object的定義,繼續深入進去看下..

objc_object

objc_object其實是一個結構體,結構體里包含一個指向Class類的isa指針。根據isa指針就可以找到id實例所屬的Class類了。

struct objc_object { Class isa; };

發現一個Class的定義,繼續深入進去看下..

Class

Class是一個指針類型,指向了objc_class類型。

typedef struct objc_class *Class;

發現一個objc_class的定義,繼續深入進去看下..

objc_class

這個objc_class可是一個重要大明星。也是runtime的重點。到這里,我們可以得出一個結論:每個id對象都有一個指向所屬類的指針isa。通過該指針,對象可以找到它所屬的類,也可以找到了其全部父類(這一句需要在學完objc_class結構體后得到,不過本篇不打算再說objc_class了,因為篇幅有限,重點需要另開一篇來學習總結)。

花開兩朵各表一枝,這條線先挖到objc_class這里。然后回頭繼續看objc_msgSend的第二個參數SEL類型的op。

SEL

SEL其實是selector方法選擇器的標示,換言之:SEL是用來標示selector的。

typedef struct objc_selector *SEL;

Objc在編譯時,會依據每一個方法的名字、參數序列,生成一個唯一的整型標識(Int類型的地址),這個標識就是SEL。如下代碼所示:

SEL sel = @selector(method); NSLog(@"sel: %p", sel);//output:sel: 0x108dfbba3

兩個類之間,不管它們是父類與子類的關系,還是之間沒有這種關系,只要方法名相同,那么它的SEL就是一樣的。每一個方法都對應著一個SEL。編譯器會根據每個方法的方法名為那個方法生成唯一的SEL。這些SEL組成了一個Set集合,當我們在這個集合中查找某個方法時,只需要去找這個方法對應的SEL即可。而SEL本質是一個字符串,所以直接比較它們的地址即可。

當然,不同的類可以擁有相同的selector。不同類的實例對象執行相同的selector時,會在各自的方法列表中去根據selector去尋找自己對應的IMP。


objc_msgSend的調用過程(先理解其中的概念):

當向一個對象發送消息時,objc_msgSend方法根據對象的isa指針找到對象的類,然后在類的調度表(dispatch table)中查找selector。如果無法找到selector,objc_msgSend通過指向父類的指針找到父類,并在父類的調度表(dispatch table)中查找selector,以此類推直到NSObject類。一旦查找到selector,objc_msgSend方法根據調度表的內存地址調用該實現。 通過這種方式,message與方法的真正實現在執行階段才綁定。

為了保證消息發送與執行的效率,系統會將全部selector和使用過的方法的內存地址緩存起來。每個類都有一個獨立的緩存,緩存包含有當前類自己的 selector以及繼承自父類的selector。查找調度表(dispatch table)前,消息發送系統首先檢查receiver對象的緩存。

上面的描述如下圖所示:

至此初步認識了runtime,也初步了解了Objc的重要概念內容,比如id、SEL等。當然更深的東西,還要繼續學習挖掘~~~

轉載于:https://www.cnblogs.com/vokie/p/9282801.html

總結

以上是生活随笔為你收集整理的一、Objective-C之Runtime的概念的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产乱码精品一区二区 | 亚洲国产专区 | 99在线观看精品视频 | 日韩经典第一页 | 国产第5页 | 福利小视频在线观看 | 亚洲精品国产电影 | 亚洲欧洲精品成人久久奇米网 | 深爱激情av | 欧美色偷偷| 影音先锋在线看片资源 | 国产精品99久久久久 | 熟女丰满老熟女熟妇 | 欧美整片在线观看 | 91桃色视频在线观看 | 粉嫩av网址 | 国模视频一区 | 三级影片在线播放 | 中文字幕人妻一区二区 | 狠狠伊人 | 欧美s码亚洲码精品m码 | 国产精品99久久久久久大便 | 人妻大战黑人白浆狂泄 | 亚洲精品女人久久久 | 亚洲视频h | 国产高清自拍视频 | 欧美日韩激情 | 一个人看的www日本高清视频 | 成年人免费看的视频 | 天堂资源| 亚洲男女视频在线观看 | 国产拍拍视频 | 亚洲黄色在线网站 | 熟女一区二区三区四区 | 欧美久久免费 | 日韩色一区 | 毛片视频免费 | 顶级尤物极品女神福利视频 | 嫩模被强到高潮呻吟不断 | 玩弄人妻少妇500系列 | 成人精品视频网站 | 看毛片的网站 | 中文字幕精品亚洲 | 波多野结衣成人在线 | 三年大全国语中文版免费播放 | 一区二区三区免费视频观看 | 日本精品网站 | 伦乱天堂| 久久午夜电影网 | 三级黄色网 | 亚洲婷婷小说 | 打屁股视频网站 | 国产精品国产三级国产aⅴ原创 | 天天婷婷 | 亚洲美女久久久 | 欧美精产国品一二三区 | 夜夜操天天射 | 性欧美色图 | 一级特黄aa大片免费播放 | 激情网络 | 国产成人精品一区二 | 国产精品偷伦视频免费看 | 欧美a在线观看 | 日韩一二三区在线观看 | 97香蕉超级碰碰久久免费软件 | 成人激情在线视频 | 久久精品爱 | 九九精品在线播放 | 精品人妻伦一二三区久久 | www日本www| 午夜激情综合 | 久久久不卡 | 国产一级做a| 亚洲v在线 | 玉米地疯狂的吸允她的奶视频 | 日韩不卡视频一区二区 | 亚洲精品一区二区在线观看 | 亚洲欧美一区二区三区孕妇 | 久久精品无码一区二区三区免费 | 97超碰人人澡人人爱学生 | 成人一区二区视频 | 夜夜操综合 | 国产明星换脸xxxx色视频 | 国产a级淫片 | 国产精品无码一区二区三区在线看 | 91禁在线看| 中文字幕精品在线视频 | 夜夜骑夜夜骑 | 国产在线观看免费高清 | 天天操天天射天天爱 | 艳妇臀荡乳欲伦交换电影 | 操碰在线视频 | 精品欧美乱码久久久久久 | 色屁屁www影院免费观看入口 | 亚洲v | 天堂成人国产精品一区 | 日本三级中国三级99人妇网站 | 欧美日韩中文字幕一区二区三区 | 尤物网站在线观看 |