runtime使用之消息發(fā)送的本質(zhì)

前言

  • 本章主要是描述如何簡單使用runtime,runtime蘋果官方是開源的,想要了解更多的朋友可以直接去看官方源碼.

一, runtime簡介

  • runtime簡稱為運(yùn)行時,OC是運(yùn)行時機(jī)制,比如OC的消息機(jī)制.
  • 關(guān)于C語言,我們都知道它是在編譯的時候就會決定去調(diào)用哪個函數(shù).
  • 但是,OC是在編譯的時候并不能調(diào)用函數(shù),而是在運(yùn)行的時候才會真正的去根據(jù)函數(shù)名去找到并調(diào)用對應(yīng)的函數(shù)的方法.
  • OC與C語言區(qū)別之一:OC是運(yùn)行時機(jī)制,C語言是編譯時機(jī)制.比如說:在OC中,只要你聲明了函數(shù),但是沒有去實(shí)現(xiàn)它,在編譯的時候是不會報錯的,只有在運(yùn)行的時候才會報錯.但是,C語言只要你沒有聲明函數(shù),如果直接去實(shí)現(xiàn)方法的話,它會在編譯的時候就會報錯.

二, runtime的作用

1, 發(fā)送消息
  • 眾所周知, OC是消息機(jī)制,其本質(zhì)就是讓對象發(fā)送消息,計算機(jī)是無法讀取OC語言,其本質(zhì)是將OC語言通過runtime轉(zhuǎn)化為C語言,最后轉(zhuǎn)為二進(jìn)制.
  • 使用runtime的前提是需要導(dǎo)入#import< objc/message.h>
    或者是#imaport< objc/runtime.h >
  • 只有對象才能發(fā)送消息,在runtime中發(fā)送消息的方法是:objc_msgSend, runtime中的方法大多都是以objc開頭的.

三, runtime的使用場景

  • 使用場景1 : runtime的消息機(jī)制,自己寫自己的框架
  • 使用場景2 : 如果我們想要去調(diào)用別的框架或者是系統(tǒng)中沒有暴露出來的方法.
  • 使用場景3 : 如果我們想要研究系統(tǒng)內(nèi)部有哪些私有方法, 有哪些私有屬性.
  • 使用場景4 : 如果我們想要獲取到系統(tǒng)自帶的控件的子控件
  • 實(shí)現(xiàn)原理 : 根據(jù)方法名去找對應(yīng)的方法實(shí)現(xiàn),具體例子如下:
 // 新建一個學(xué)生類WGStudent, 在類中什么一個對象方法和類方法.
 #import <Foundation/Foundation.h>

WGStudent.h文件
@interface WGStudent : NSObject

  // - (void)study;
  // + (void)eat;

@end

WGStudent.m文件
#import "WGStudent.h"

@implementation WGStudent

- (void)study {
    NSLog(@"學(xué)習(xí)數(shù)學(xué)");
}

+ (void)eat {
    NSLog(@"吃飯");
}
@end
  • 注意 : 這里新建WGStudent類的目的主要是用于解釋類的調(diào)用原理
#import "ViewController.h"
#import "WGStudent.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

//  對象發(fā)送消息
    // OC中調(diào)用對象方法
    WGStudent *student = [[WGStudent alloc] init];

    [student study];

    // [student study]的本質(zhì)就是讓對象發(fā)送消息
    objc_msgSend(student @selecter(study));

// 類調(diào)用對象方法,發(fā)送消息
// 調(diào)用類方法的方式:兩種

    // 第一種通過類名調(diào)用
    [student eat];
    // 第二種通過類對象調(diào)用
    [[student class] eat];

    // 用類名調(diào)用類方法蹦漠,底層會自動把類名轉(zhuǎn)換成類對象調(diào)用
    // 本質(zhì):讓類對象發(fā)送消息
    objc_msgSend([student class], @selector(eat));
}

@end

  • 特別注意 : 如果你這里就運(yùn)行程序,程序會直接報錯,所以這里需要做兩步操作.
  • 1, 判斷是否導(dǎo)入#import< objc/message.h> 或者 #imaport< objc/runtime.h >
  • 2, 進(jìn)入工程 -> Build Settting -> msg -> No(不嚴(yán)格檢測發(fā)送消息的調(diào)用)

四, 解析創(chuàng)建一個對象時,如何使用runtime轉(zhuǎn)化OC的.

// 解析創(chuàng)建對象過程
WGStudent *student = [[WGStudent alloc] init];

// 1, 分配存儲空間
    WGStudent *student = [WGStudent alloc];
--> 使用runtime創(chuàng)建對象
    objc_msgSend([WGStudent class], @selector(alloc));

// 2, 初始化
    student = [student init];
--> 使用runtime進(jìn)行初始化
    student = objc_msgSend(student, @selector(init));

// 3, 調(diào)用對象方法
    [student study];
--> 使用runtime調(diào)用方法
    objc_msgSend(student, @selector(study));

  • 知識拓展 :

  • 1, xcode6開始,蘋果不推薦我們使用runtime,把很多函數(shù)的參數(shù)注釋.

  • 2, xcode6做了一些事情,導(dǎo)致不能調(diào)用objc_msgSend

  • 注意點(diǎn):把函數(shù)名轉(zhuǎn)換成某個函數(shù)指針,一定要用括號包住,在調(diào)用


    ((NSObject * (*)(id, SEL))objc_msgSend)(self,@selector(eat));
    objc_msgSend(self,@selector(eat));

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谅摄,一起剝皮案震驚了整個濱河市延旧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噪舀,老刑警劉巖畏铆,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件默伍,死亡現(xiàn)場離奇詭異传货,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莉给,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門毙石,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颓遏,你說我怎么就攤上這事徐矩。” “怎么了州泊?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵丧蘸,是天一觀的道長。 經(jīng)常有香客問我遥皂,道長,這世上最難降的妖魔是什么刽漂? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任演训,我火速辦了婚禮,結(jié)果婚禮上贝咙,老公的妹妹穿的比我還像新娘样悟。我一直安慰自己,他們只是感情好庭猩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布窟她。 她就那樣靜靜地躺著,像睡著了一般蔼水。 火紅的嫁衣襯著肌膚如雪震糖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天趴腋,我揣著相機(jī)與錄音吊说,去河邊找鬼论咏。 笑死,一個胖子當(dāng)著我的面吹牛颁井,可吹牛的內(nèi)容都是我干的厅贪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雅宾,長吁一口氣:“原來是場噩夢啊……” “哼养涮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眉抬,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤单寂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吐辙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣决,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年昏苏,在試婚紗的時候發(fā)現(xiàn)自己被綠了尊沸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡贤惯,死狀恐怖洼专,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孵构,我是刑警寧澤屁商,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站颈墅,受9級特大地震影響蜡镶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恤筛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一官还、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毒坛,春花似錦望伦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豪直,卻和暖如春劣摇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顶伞。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工饵撑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剑梳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓滑潘,卻偏偏與公主長得像垢乙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子语卤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉追逮,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評論 0 9
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,136評論 0 9
  • 對于從事 iOS 開發(fā)人員來說,所有的人都會答出【runtime 是運(yùn)行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,722評論 7 64
  • 詩詞歌賦篇章中曾記載“又是人間四月天,陰曹路上是何年?碑前片片飛花亂,眼底絲絲淚血煎.”誰又知喚兒聲聲在耳邊粹舵,轉(zhuǎn)身...
    城磚上的印記閱讀 1,255評論 0 0
  • 九月就看到這部片子(剩者為王)钮孵,沒想到首映居然是我生日當(dāng)天,對男神的好感又飆升了一級眼滤,上個月開始一直被朋友們提醒6...
    shally925閱讀 284評論 0 1