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

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

iOS開發日記17-runtime基礎篇

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

今天博主有一個runtime基礎的需求,遇到了一些困難點,在此和大家分享,希望能夠共同進步.

Objective-C runtime是一個運行時庫,主要是由C語言和匯編語言寫成,為C語言添加面向對象的能力而創造了Objective-C。這意味著它可以加載類信息,進行方法派發以及方法轉發等等。Objective-C 運行時最重要的就是為Objective-C語言的面向對象特性的實現提供了所有的基礎支撐.

 

那么,runtime具體究竟是什么呢?相信各位看官百度了很多文章后,發現十篇有九篇都看不懂,這時因為有很多基礎的東西我們并不了解,今天博主就和大家分享一下,runtime基礎篇

我們寫的代碼在程序運行過程中都會被轉化成runtime的C代碼執行,例如[xxxxxx doSomething];會被轉化成objc_msgSend(xxxxxx, @selector(doSomething));

OC中一切都被設計成了對象,我們都知道一個類被初始化成一個實例,這個實例是一個對象。實際上一個類本質上也是一個對象,在runtime中用結構體表示。

 

相關的定義:

/// 描述類中的一個方法typedef struct objc_method *Method;/// 實例變量typedef struct objc_ivar *Ivar;/// 類別Categorytypedef struct objc_category *Category;/// 類中聲明的屬性typedef struct objc_PRoperty *objc_property_t;

類在runtime中的表示

//類在runtime中的表示struct objc_class {  Class isa;//指針,顧名思義,表示是一個什么,  //實例的isa指向類對象,類對象的isa指向元類#if !__OBJC2__  Class super_class;  //指向父類  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 //協議列表  #endif} OBJC2_UNAVAILABLE;/* Use `Class` instead of `struct objc_class *` */

相信很多看官看到這里的時候,就已經有想關屏幕的沖動了,下面給大家分享一下isa指針和meta class(元類)

每個對象都會有一個它所屬的類。這是面向對象的基本概念,但是在OC中,這對所有數據結構有效。任何數據結構,只要在恰當的位置具有一個指針指向一個class,那么,它都可以被認為是一個對象。
在OC中,一個對象所屬于哪個類,是由它的isa指針指向的。這個isa指針指向這個對象所屬的class。

isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向對象的類,而Class里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當類方法被調用時,先會從本身查找類方法的實現,如果沒有,元類會向他父類查找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass).根元類的isa指針指向本身,這樣形成了一個封閉的內循環

一個OC的類其實也是一個對象,意思就是你可以向一個類發送消息。
NSStringEncoding defaultStringEncoding = [NSString defaultStringEncoding];
在這個例子中,defaultStringEncoding 被發送給了NSString類。因為每一個OC的類本身也是一個對象。也就是說Class的數據結構必然也是以isa指針開始的在二進制級別上與objc_object是完全兼容的。然后一個類結構的下一個字段一定是一個指向super class的指針(或者指向nil,對于基類而言)。
一個類如何定義有很多方法,依賴于你的運行時庫版本,但是不管哪種方法,他們都是以一個isa作為第一個字段,接著是superclass字段

為了可以調用類方法,這個類的isa指針必須指向一個包含這些類方法的類結構體。
這樣就引出了meta-class的概念:meta-class是一個類對象的類。
簡單解釋下:
       當你向一個對象發送消息時,runtime會在這個對象所屬的那個類的方法列表中查找。
       當你向一個類發送消息時,runtime會在這個類的meta-class的方法列表中查找。

meta-class之所以重要,是因為它存儲著一個類的所有類方法。每個類都會有一個單獨的meta-class,因為每個類的類方法基本不可能完全相同
meta-class,就像Class一樣,也是一個對象。你依舊可以向它發送消息調用函數,自然的,meta-class也會有一個isa指針指向其所屬類。所有的meta-class使用基類的meta-class作為他們的所屬類。具體而言,任何NSObject繼承體系下的meta-class都使用NSObject的meta-class作為自己所屬的類。

根據這個規則,所有的meta-class使用基類的meta-class作為它們的類,而基類的meta-class也是屬于它自己,也就是說基類的meta-class的isa指針指向它自己。
就像一個類使用super_class指針指向自己的父類一樣,meta-class的super_class會指向類的super_class的meta-class。一直追溯到基類的meta-class,它的super_class會指向基類自身

這樣一來,整個繼承體系中的實例、類和meta-class都派生自繼承體系中的基類。對于NSObject繼承體系來說,NSObject的實例方法對體系中所有的實例、類和meta-class都是有效的;NSObject的類方法對于體系中所有的類和meta-class都是有效的
meta-class是類對象的類,每個類都有自己單獨的meta-class。所有的類對象并不會屬于同一個meta-class。

meta-class要保證類對象具有繼承體系中基類的所有實例和類方法,以及繼承體系中的所有中間類方法。對于所有NSObject繼承體系下的類,NSObject的實例方法和協議方法對他們和他們meta-class的對象都要有效。
所有的meta-class使用基類的meta-class作為自己的基類,對于頂層基類的meta-class也是一樣,只是它指向自己而已
 
還有幾篇文章可以增加各位對runtime的理解
http://quotation.github.io/objc/2015/05/21/objc-runtime-ivar-access.html
http://www.jianshu.com/p/425a39d43d16?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo
http://mp.weixin.QQ.com/s?__biz=MjM5NTIyNTUyMQ==&mid=208927760&idx=1&sn=30b9caecba709553e463d719668454ae&scene=2&from=timeline&isappinstalled=0#rd


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九色精品美女在线| 国产精品欧美久久久| 欧美猛男性生活免费| 久久成人精品一区二区三区| 久久精品电影一区二区| 久久中国妇女中文字幕| 97色在线播放视频| 在线日韩日本国产亚洲| 亚洲成人激情在线| 国产精品久久久久免费a∨| 日韩电影中文字幕在线| 国产精品草莓在线免费观看| www.日韩系列| 日韩精品小视频| 亚洲欧美一区二区三区四区| 亚洲激情第一页| 亚洲欧洲日本专区| 亚洲第一页在线| 91精品啪aⅴ在线观看国产| 亚洲精品自产拍| 中文字幕亚洲欧美日韩在线不卡| 欧美性做爰毛片| 欧美综合国产精品久久丁香| 8090成年在线看片午夜| 国产精品丝袜久久久久久高清| 久久久精品视频在线观看| 久热99视频在线观看| 国产女人精品视频| 国产免费久久av| 成人h片在线播放免费网站| 国产成人一区二区三区小说| 久久亚洲精品国产亚洲老地址| 久久久久久亚洲精品不卡| 亚洲精品网站在线播放gif| 欧美一级片免费在线| 欧美高清在线观看| 亚洲欧洲第一视频| 欧美性xxxx极品hd欧美风情| 欧美人与性动交a欧美精品| 久久成人一区二区| 97免费中文视频在线观看| 欧美制服第一页| 久久国产精品久久久久久| 精品国产999| 久久影院在线观看| 久久久久亚洲精品| 久久久久久中文字幕| 精品视频在线播放| 国产精品成人免费电影| 日韩欧美成人网| 91国产美女在线观看| 精品国偷自产在线视频99| 中文字幕欧美在线| 亚洲欧洲一区二区三区久久| 91精品在线观看视频| 日本国产一区二区三区| 中文字幕亚洲情99在线| 国产精品美女午夜av| 亚洲va欧美va在线观看| 久久久久久久久久久91| 久久视频国产精品免费视频在线| 中文精品99久久国产香蕉| 日韩欧美大尺度| 国产啪精品视频网站| 久久久久国产一区二区三区| 国产午夜精品久久久| www国产91| 国产精品黄色影片导航在线观看| 成人激情视频在线观看| 欧美裸体男粗大视频在线观看| 亚洲国产精品久久| 欧美大胆a视频| 亚洲人成网站999久久久综合| 国内精品久久久久影院 日本资源| 在线观看欧美日韩| 国内外成人免费激情在线视频| 国产精品丝袜久久久久久不卡| 欧美高清自拍一区| 91色琪琪电影亚洲精品久久| 久久视频在线看| 久久久精品视频成人| 91中文字幕在线| 亚洲欧洲日本专区| 91亚洲va在线va天堂va国| 国产精品第七十二页| 欧洲成人在线观看| 国产精品久久久av| 深夜福利国产精品| 午夜精品久久久久久久99黑人| 色噜噜久久综合伊人一本| 国产欧美日韩精品丝袜高跟鞋| 国产视频在线一区二区| 欧美日韩激情美女| 亚洲剧情一区二区| 国产日韩欧美视频在线| 欧美在线视频导航| 亚洲精品国产精品国自产观看浪潮| 精品一区二区三区四区| 欧美华人在线视频| 亚洲aaaaaa| 久久久伊人欧美| 久久久久久国产精品美女| 久久影院免费观看| 亚洲一区二区三区成人在线视频精品| 国产美女直播视频一区| 一区二区欧美亚洲| 亚洲精品有码在线| 亚洲在线视频观看| 久久国内精品一国内精品| 亚洲视频在线观看视频| 国产精品日韩电影| 日韩欧美国产黄色| 日韩中文字幕久久| 国产网站欧美日韩免费精品在线观看| 91精品久久久久久久久久另类| 精品伊人久久97| 综合网日日天干夜夜久久| 456国产精品| 欧美性猛交xxxx免费看久久久| 国产精品视频资源| 97热在线精品视频在线观看| 97视频在线观看免费| 欧洲美女免费图片一区| 国产在线98福利播放视频| 欧美激情小视频| 欧美成人手机在线| 全亚洲最色的网站在线观看| 国产欧美在线看| 亚洲一区二区三区视频| 国产精品视频自在线| 欧美黄色片视频| 国产精品久久久久久av福利| 国产激情久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲第一男人av| 91精品国产成人www| 日韩视频亚洲视频| 日韩三级成人av网| 国产精品视频区| 国产日韩欧美电影在线观看| 国产精品91免费在线| 一区二区欧美久久| 日韩中文字幕欧美| 欧美日韩亚洲系列| 亚洲视频视频在线| 欧美日本精品在线| 亚洲第一网站男人都懂| 日本久久91av| 日韩一区二区av| 亚洲大胆人体视频| 色婷婷av一区二区三区久久| 国产精品欧美一区二区三区奶水| 日韩视频免费看| 性欧美亚洲xxxx乳在线观看| 国产精品亚洲美女av网站| 日韩国产精品一区| 2018中文字幕一区二区三区| 一本一道久久a久久精品逆3p| 成人黄色免费在线观看| 日韩av一区在线| 日韩电影中文字幕在线观看| 91欧美激情另类亚洲| 久久精品青青大伊人av| 97久久精品人人澡人人爽缅北|