iOS Runtime運用之一 消息傳遞objc_msgSend

關(guān)于runtime的運用有:
1 消息傳遞(調(diào)用方法): objc_msgSend
2 動態(tài)添加方法 : class_addMethod
3 交換方法(Method Swizzling)
4 動態(tài)添加屬性(在分類中添加屬性,以及獲取私有屬性或成員變量_ivar)
5 NSCoding自動歸檔解檔
(場景:如果一個模型有許多個屬性族扰,實現(xiàn)自定義模型數(shù)據(jù)持久化時,需要對每一個屬性都實現(xiàn)一遍encodeObject 和 decodeObjectForKey方法,比較麻煩渔呵。我們就可以使用Runtime獲取屬性列表遍歷屬性來解決怒竿。
原理:用runtime提供的函數(shù)遍歷Model自身所有屬性,并對屬性進(jìn)行encode和decode操作扩氢。)
6 字典轉(zhuǎn)模型(原理同上)
7 熱更新 比如jspatch 基礎(chǔ)原理是OC的動態(tài)語言特性
OC的消息機(jī)制消息發(fā)送耕驰,動態(tài)解析,消息轉(zhuǎn)發(fā)录豺。就是在消息轉(zhuǎn)發(fā)階段動態(tài)的添加了方法的實現(xiàn)朦肘,以達(dá)到熱修復(fù)的目的。
8 制作插件

objc_msgSend應(yīng)用場景

  1. 創(chuàng)建并初始化對象
  2. 發(fā)送無參數(shù)無返回值的消息
  3. 發(fā)送有參數(shù)無返回值的消息
  4. 發(fā)送有參數(shù)有返回值",
  5. 帶浮點返回值的消息"
//注意?? 
#import <objc/runtime.h>
#import <objc/message.h>

創(chuàng)建并初始化對象

   //1.創(chuàng)建對象在執(zhí)行Person *p = [[Person alloc]init]時双饥,會轉(zhuǎn)換成以下代碼
   Person *person = ((Person * (*)(id, SEL))objc_msgSend)((id)[Person class], @selector(alloc));
   //2.初始化對象
   p = ((Person * (*)(id,SEL))objc_msgSend)((id)person, @selector(init));

發(fā)送無參數(shù)無返回值的消息

- (void)action_method1{
   ((void (*)(id,SEL))objc_msgSend)(self,@selector(action_test1));
}
- (void)action_test1{
    NSLog(@"執(zhí)行了");
}

發(fā)送有參數(shù)無返回值的消息

- (void)action_method2{
    NSString *str = @"喵喵桑愛妙鮮包";
    ((void (*)(id, SEL, NSString *))objc_msgSend)(self, @selector(action_test2:),str);
}
- (void)action_test2:(id)info{
    NSLog(@"吃了小孩");
}

發(fā)送有參數(shù)有返回值的消息

- (void)action_method3{
    NSString *str = @"以前的字符串";
    str = ((id (*)(id, SEL, NSString *))objc_msgSend)(self, @selector(action_test3:),str);
    NSLog(@"str = %@",str);
}
- (id)action_test3:(id)info{
    return @"獲得新的字符串";
}

發(fā)送帶有浮點類型的消息 (可以用objc_msgSend_fpret)

- (void)action_method4{
    float price = ((float (*)(id, SEL))objc_msgSend_fpret)(self, @selector(action_test4));
    NSLog(@"價格price = %f",price);
}
- (float)action_test4{
    return 100.5;
}

發(fā)送帶有結(jié)構(gòu)體返回值的消息

- (void)action_method5{
    CGRect frame = ((CGRect (*)(id, SEL))objc_msgSend_stret)(self, @selector(action_test5));
    NSLog(@"frame = %@", NSStringFromCGRect(frame));
}
- (CGRect)action_test5{
    return CGRectMake(15, 0, 200, 100);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媒抠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兢哭,更是在濱河造成了極大的恐慌领舰,老刑警劉巖夫嗓,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迟螺,死亡現(xiàn)場離奇詭異,居然都是意外死亡舍咖,警方通過查閱死者的電腦和手機(jī)矩父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來排霉,“玉大人窍株,你說我怎么就攤上這事」ツ” “怎么了球订?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瑰钮。 經(jīng)常有香客問我冒滩,道長,這世上最難降的妖魔是什么浪谴? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任开睡,我火速辦了婚禮,結(jié)果婚禮上苟耻,老公的妹妹穿的比我還像新娘篇恒。我一直安慰自己,他們只是感情好凶杖,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布胁艰。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腾么。 梳的紋絲不亂的頭發(fā)上醋虏,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機(jī)與錄音哮翘,去河邊找鬼颈嚼。 笑死,一個胖子當(dāng)著我的面吹牛饭寺,可吹牛的內(nèi)容都是我干的阻课。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼艰匙,長吁一口氣:“原來是場噩夢啊……” “哼限煞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起员凝,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤署驻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后健霹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旺上,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年糖埋,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣吱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞳别,死狀恐怖征候,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祟敛,我是刑警寧澤疤坝,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站馆铁,受9級特大地震影響跑揉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叼架,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一畔裕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乖订,春花似錦扮饶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛点。三九已至,卻和暖如春岂丘,著一層夾襖步出監(jiān)牢的瞬間陵究,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工奥帘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留铜邮,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓寨蹋,卻偏偏與公主長得像松蒜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子已旧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 前言想要通過runtime發(fā)送消息秸苗,就必須要掌握runtime如何發(fā)送消息,是調(diào)用哪個函數(shù)运褪?又是如何調(diào)用的惊楼?本篇文...
    reallychao閱讀 891評論 0 0
  • 前言 想要通過runtime發(fā)送消息,就必須要掌握runtime如何發(fā)送消息秸讹,是調(diào)用哪個函數(shù)檀咙?又是如何調(diào)用的?本篇...
    G_GUI閱讀 626評論 0 0
  • 在OC中嗦枢,我們對方法的調(diào)用都會被轉(zhuǎn)換成內(nèi)部的消息發(fā)送執(zhí)行對objc_msgSend方法的調(diào)用攀芯,掌握好消息發(fā)送,可以...
    啊啊啊啊鋒閱讀 4,409評論 5 12
  • 前言想要通過runtime發(fā)送消息文虏,就必須要掌握runtime如何發(fā)送消息,是調(diào)用哪個函數(shù)殖演?又是如何調(diào)用的氧秘?本篇文...
    LWide閱讀 7,324評論 0 5
  • 參數(shù)自一個指針,指向類的要接收消息的實例趴久。 OP在處理該信息的方法的選擇丸相。 ......可變參數(shù)列表包含參數(shù)的方法...
    reallychao閱讀 803評論 0 0