RunTime

之前沒怎么注意Runtime,最近花了點時間學(xué)習(xí)了下Runtime。雖然網(wǎng)上的資料很多懂算,但是自己總結(jié)一下也是蠻好的只冻。

一,什么是Runtime

runtime即運行時计技,是一套純C的API,而Objective-C就是運行時機制的喜德,其中最主要的就是消息機制。
??Objective-C是基于C的垮媒,它為C添加了面向?qū)ο蟮奶匦陨崦酢:芊旱恼f,C+Runtime = Objective-C睡雇,可以說Runtime是我們 Objective-C幕后工作者萌衬。
??我們都知道在編譯的時候C語言調(diào)用了未實現(xiàn)的函數(shù)就會報錯;而OC中只要聲明了就不會報錯它抱,只有當(dāng)運行的時候才會報錯秕豫,這是因為OC是運行時動態(tài)調(diào)用的。

二抗愁,Runtime的作用

要想使用runtime馁蒂,必須要導(dǎo)入頭文件呵晚,runtime.h
??方法發(fā)送消息的本質(zhì)是讓對象發(fā)送消息,可以通過objc_msgSend讓對象發(fā)送消息沫屡。
runtime 用來干什么呢饵隙??用在那些地方呢沮脖?怎么用呢金矛?

首先要導(dǎo)入頭文件#import <objc/message.h>,其實導(dǎo)入runtime也是可以的勺届,但是message中導(dǎo)入了runtime驶俊,所以我們可以直接導(dǎo)入message。
??我們所寫的OC代碼免姿,Xcode最終會將其編譯成一份C++文件饼酿,生成.opp文件。通過指令 clong -rewrite-objc main.m就會把main.m生成最終代碼胚膊,它會幫我們做很多的事情故俐,這里沒深入進(jìn)去。
??如果說方法發(fā)送消息的本質(zhì)是讓對象發(fā)送消息的話紊婉,我們可以用底層的方法來實現(xiàn)方法發(fā)送消息药版。
??但是當(dāng)我們使用objc_msgSend方法的時候發(fā)現(xiàn),被蘋果給注釋掉了喻犁,這里我們可以在配置里面設(shè)置槽片,將其選擇為NO,然后我們就可以使用消息機制了肢础,如下圖还栓。


執(zhí)行方法

#假設(shè)有一個學(xué)生Student類 
Student *student = [Student alloc] init];
runtime:  objc_msgSend(student, @selector(sayHello));
OC: [self sayHello];

在程序運行過程中, 動態(tài)地為某個類添加屬性或方法, 修改屬性值或方法 遍歷一個類的所有成員變量(屬性)所有方法
例如:我們需要對一個類的屬性進(jìn)行歸檔解檔的時候?qū)傩蕴貏e的多,這時候乔妈,我們就會寫很多對應(yīng)的代碼蝙云,但是如果使用了runtime就可以動態(tài)設(shè)置氓皱!

查詢類成員變量及類型

/**
 *  必備常識:
 *  Ivar : 成員變量    如果要是動態(tài)創(chuàng)建/修改/查看屬性路召,可以使用Ivar
 *  Method : 成員方法  如果要是動態(tài)創(chuàng)建/修改/查看方法,可以使用Method
 *  下面的例子教大家一些runtime簡單的 查看類中屬性和方法以及動態(tài)添加屬性和方法和修改屬性.
 */

/**
 *  通過類的名字來獲取類里面包含的所有屬性
 *
 *  @param className 類名(egs:UIView)
 */
- (void)getIvarsNameListWithClassName:(NSString *)className
{
    //通過類的名字獲取到類(egs:通過"學(xué)生"這個類的名字找到"學(xué)生"這個類)
    Class ClassName = NSClassFromString(className);
    
    //定義一個變量來存放遍歷出來類里面屬性的個數(shù)
    unsigned int outConut = 0;
    //查取類里面所有的屬性
    Ivar * vars = class_copyIvarList([ClassName class], &outConut);
    //打印類里面有多少個屬性
    NSLog(@"%d",outConut);
    
    //遍歷類里面所有的屬性 和 屬性類型
    for (int i = 0; i < outConut; i ++) {
        //獲取類里面屬性的名字(將IVar變量轉(zhuǎn)化為字符串)
        const char * ivarName = ivar_getName(vars[i]);
        //獲取類里面屬性的類型(獲取IVar的類型)
        const char * ivarType = ivar_getTypeEncoding(vars[i]);
        //打印屬性的名字和類型
        printf("屬性名字:%s 屬性類型:%s\n",ivarName,ivarType);
        }

查詢類方法名及類型

/**
 *  通過類的名字,查看類中所有的方法
 *
 *  @param className 類的名字(egs:UIView)
 */
- (void)getMethodNameListWithClassName:(NSString *)className
{
    //如果想添加方法直接調(diào)用就行了(只需要改一下類)
    //添加方法
    [self addMethod];
    /**
     * class_copyMethodList:獲取所有方法
     * method_getName:讀取一個Method類型的變量波材,輸出我們在上層中很熟悉的SEL
     *
     */
    
    //通過類的名字,獲取到類
    Class ClassName = NSClassFromString(className);
    //定義一個變量來存放遍歷出來類里面屬性的個數(shù)
    unsigned int count = 0;
    //查取類里面所有的屬性
    Method * method = class_copyMethodList(ClassName, &count);
    //遍歷類里面所有的屬性 和 屬性類型
    for (int i = 0; i < count; i ++) {
        //獲取類里面方法的名字
        SEL methodName = method_getName(method[i]);
        //獲取類里面方法的類型
        const char * methodType = method_copyReturnType(method[i]);
        NSLog(@"方法名字:%@,方法類型:%s",NSStringFromSelector(methodName),methodType);
    }
    
    
}

如有雷同股淡,你就是抄我的!?????? --大展

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廷区,一起剝皮案震驚了整個濱河市唯灵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隙轻,老刑警劉巖埠帕,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垢揩,死亡現(xiàn)場離奇詭異,居然都是意外死亡敛瓷,警方通過查閱死者的電腦和手機叁巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呐籽,“玉大人锋勺,你說我怎么就攤上這事〗频” “怎么了庶橱?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贪惹。 經(jīng)常有香客問我苏章,道長,這世上最難降的妖魔是什么奏瞬? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任布近,我火速辦了婚禮,結(jié)果婚禮上丝格,老公的妹妹穿的比我還像新娘撑瞧。我一直安慰自己,他們只是感情好显蝌,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布预伺。 她就那樣靜靜地躺著,像睡著了一般曼尊。 火紅的嫁衣襯著肌膚如雪酬诀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天骆撇,我揣著相機與錄音瞒御,去河邊找鬼。 笑死神郊,一個胖子當(dāng)著我的面吹牛肴裙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涌乳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蜻懦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夕晓?” 一聲冷哼從身側(cè)響起宛乃,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后征炼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體析既,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年谆奥,在試婚紗的時候發(fā)現(xiàn)自己被綠了渡贾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡雄右,死狀恐怖空骚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擂仍,我是刑警寧澤囤屹,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站逢渔,受9級特大地震影響肋坚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肃廓,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一智厌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盲赊,春花似錦铣鹏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绘迁,卻和暖如春合溺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缀台。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工棠赛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膛腐。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓睛约,卻偏偏與公主長得像,于是被迫代替她去往敵國和親依疼。 傳聞我的和親對象是個殘疾皇子痰腮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 對于從事 iOS 開發(fā)人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,700評論 7 64
  • 參數(shù)自一個指針律罢,指向類的要接收消息的實例。 OP在處理該信息的方法的選擇。 ......可變參數(shù)列表包含參數(shù)的方法...
    reallychao閱讀 797評論 0 0
  • objc_getAssociatedObject返回與給定鍵的特定對象關(guān)聯(lián)的值误辑。ID objc_getAssoci...
    有一種再見叫青春閱讀 1,571評論 0 7
  • Runtime是什么 Runtime 又叫運行時沧踏,是一套底層的 C 語言 API,其為 iOS 內(nèi)部的核心之一巾钉,我...
    SuAdrenine閱讀 871評論 0 3
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,132評論 0 9