Runtime 10種用法

Runtime 10種用法

閱讀了多篇運行時的文章,感覺都很不錯,從幾篇文章里面提取一些個人認為比較重要的,偏實戰(zhàn)的知識點的摘錄,另外還結合了個人的創(chuàng)造形成此文墩邀。再牛逼的技術和實戰(zhàn)結合才有意義私股,本篇介紹技術盡量和實戰(zhàn)聯(lián)系起來米诉,有些沒講明白的符衔,我給的鏈接里面都有摆寄,所以我就不贅述了阎抒,如果覺得可以就點個贊吧灾炭,哈哈。不需要打賞讹剔。

1)替換系統(tǒng)方法,

2)字典轉model,

3)歸檔,

4)萬能控制器跳轉

四個偏實戰(zhàn)的方法從不同的文章中聚合到這里.沒講明白的麻煩看客去我給的鏈接里面看看油讯,他們都講了

對文章的內容我用一張圖介紹吧(圖只管明了,我喜歡,大家也喜歡)

#??appstore審核問答群:369250107,建了個倉庫:,github[專門解決蘋果拒絕各種問題匯總的倉庫](https://github.com/wg689/Solve-App-Store-Review-Problem)

runtime 文章收集:

runtime 文章專題? (13+關于runtime的)

如下4篇內容有相似的 小白都可以看懂runtime,值得細看

文①? OC最實用的runtime總結,面試延欠、工作你看我就足夠了陌兑!

文② 讓你快速上手Runtime

文③? runtime詳解

文④ 詳解runtime運行時機制

文⑤ 萬能控制器跳轉

先用一張圖對文章做一個介紹吧 (圖只管,易懂方便回憶,我喜歡,大家也喜歡)

what(runtime 是什么)

Runtime基本是用C和匯編寫的,可見蘋果為了動態(tài)系統(tǒng)的高效而作出的努力由捎。你可以在這里下到蘋果維護的開源代碼兔综。蘋果和GNU各自維護一個開源的runtime版本,這兩個版本之間都在努力的保持一致狞玛。Objective-C 從三種不同的層級上與 Runtime 系統(tǒng)進行交互软驰,分別是通過 Objective-C 源代碼,通過 Foundation 框架的NSObject類定義的方法为居,通過對 runtime 函數的直接調用碌宴。大部分情況下你就只管寫你的Objc代碼就行,runtime 系統(tǒng)自動在幕后辛勤勞作著蒙畴。

RunTime簡稱運行時,就是系統(tǒng)在運行的時候的一些機制贰镣,其中最主要的是消息機制呜象。

對于C語言,函數的調用在編譯的時候會決定調用哪個函數碑隆,編譯完成之后直接順序執(zhí)行恭陡,無任何二義性。

OC的函數調用成為消息發(fā)送上煤。屬于動態(tài)調用過程休玩。在編譯的時候并不能決定真正調用哪個函數(事實證明,在編 譯階段劫狠,OC可以調用任何函數拴疤,即使這個函數并未實現(xiàn),只要申明過就不會報錯独泞。而C語言在編譯階段就會報錯)呐矾。

只有在真正運行的時候才會根據函數的名稱找 到對應的函數來調用。

where(哪些地方使用runtime)

1.將某些OC代碼轉為運行時代碼懦砂,探究底層蜒犯,比如block的實現(xiàn)原理(上邊已講到);

2.攔截系統(tǒng)自帶的方法調用(Swizzle 黑魔法),也可以說成對系統(tǒng)的方法進行替換荞膘,比如攔截imageNamed:罚随、viewDidLoad、alloc羽资;文/滕先洪(簡書作者)? 原文鏈接:http://www.reibang.com/p/ab966e8a82e2

需求:比如iOS6 升級 iOS7 后需要版本適配淘菩,根據不同系統(tǒng)使用不同樣式圖片(擬物化和扁平化),如何通過不去手動一個個修改每個UIImage的imageNamed:方法就可以實現(xiàn)為該方法中加入版本判斷語句削罩?

步驟:

a瞄勾、為UIImage建一個分類(UIImage+Category)

b费奸、在分類中實現(xiàn)一個自定義方法弥激,方法中寫要在系統(tǒng)方法中加入的語句,比如版本判斷[參考 ]

+ (UIImage*)xh_imageNamed:(NSString*)name {

doubleversion = [[UIDevicecurrentDevice].systemVersiondoubleValue];

if(version >=7.0) {

// 如果系統(tǒng)版本是7.0以上愿阐,使用另外一套文件名結尾是‘_os7’的扁平化圖片

name = [name stringByAppendingString:@"_os7"];? ? }

return[UIImagexh_imageNamed:name];

}

c微服、分類中重寫UIImage的load方法,實現(xiàn)方法的交換(只要能讓其執(zhí)行一次方法交換語句缨历,load再合適不過了)

+ (void)load {

// 獲取兩個類的類方法

Method? m1 = class_getClassMethod([UIImageclass],@selector(imageNamed:));

Method m2 = class_getClassMethod([UIImageclass],@selector(xh_imageNamed:));

// 開始交換方法實現(xiàn)

method_exchangeImplementations(m1, m2);

}

注意:自定義方法中最后一定要再調用一下系統(tǒng)的方法以蕴,讓其有加載圖片的功能,但是由于方法交換辛孵,系統(tǒng)的方法名已經變成了我們自定義的方法名(有點繞丛肮,就是用我們的名字能調用系統(tǒng)的方法,用系統(tǒng)的名字能調用我們的方法)魄缚,這就實現(xiàn)了系統(tǒng)方法的攔截宝与!

利用以上思路焚廊,我們還可以給 NSObject 添加分類,統(tǒng)計創(chuàng)建了多少個對象习劫,給控制器添加分類咆瘟,統(tǒng)計有創(chuàng)建了多少個控制器,特別是公司需求總變的時候诽里,在一些原有控件或模塊上添加一個功能袒餐,建議使用該方法!

3.實現(xiàn)分類也可以增加屬性谤狡;

4.實現(xiàn)NSCoding的自動歸檔和自動解檔灸眼;(不用對每個屬性edcode和decode了,如果幾十個屬性一個個的encode和decode真的很麻煩啊,使用運行時可以遍歷出每個對象的屬性,數組的方式遍歷eccode,decode)

用運行時的歸檔方法

不用運行時的歸檔方法:(還好只有5個屬性,如果20個,30個或者后臺突然增加了屬性,這么直接寫死估計代碼就不靈了)

5.實現(xiàn)字典和模型的自動轉換(核心就是可以遍歷出字典中的每個屬性,json解析中大牛框架都用了這個特性,包括MJEXtension,YYModel墓懂,jsonModel都是將json轉換為字典,再遍歷字典中的每個屬性來進行modle的轉換)幢炸。

MJextension 使用運行時轉換的json轉model的部分代碼摘錄

YYModel? json轉model 核心代碼 摘錄

JsonModel json字典轉model 摘錄

獲取屬性的列表的方法是字典轉模型的比較核心的方法,

OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount)

__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

致此可以下個結論嗎?

基本上主流的json 轉model 都少不了,使用運行時動態(tài)獲取屬性的屬性名的方法,來進行字典轉模型替換,字典轉模型效率最高的(耗時最短的)的是KVC,其他的字典轉模型是在KVC 的key 和Value 做處理,動態(tài)的獲取json 中的key 和value ,當然轉換的過程中,第三方框架需要做一些判空啊,鑲嵌的邏輯處理, 再進行KVC 轉模型.這句代碼 [xx? setValue:value forKey:key];無論JsonModle,YYKIt,MJextension 都少不了[xx? setValue:value forKey:key];這句代碼的,不信可以去搜,這是字典轉模型的核心方法,

6)動態(tài)增加方法? (動態(tài)的為某個類或對象增加一個方法,摘錄文章中有詳細介紹)

7)動態(tài)變量控制? (動態(tài)對某個對象的變量的值進行替換,摘錄文章有詳細介紹)

8)實現(xiàn)萬能控制器跳轉

產品來一變態(tài)需求,推送過來的消息,要跳轉到任意控制器.利用runtime動態(tài)生成對象、屬性拒贱、方法這特性宛徊,我們可以先跟服務端商量好,定義跳轉規(guī)則逻澳,比如要跳轉到A控制器闸天,需要傳屬性id、type斜做,那么服務端返回字典給我苞氮,里面有控制器名,兩個屬性名跟屬性值瓤逼,客戶端就可以根據控制器名生成對象笼吟,再用kvc給對象賦值,這樣就搞定了

9)插件開發(fā)

插件入門

XCode 有個很坑爹的地方霸旗,就是它并不官方支持插件開發(fā)贷帮,官方沒有文檔,XCode 也沒有開源诱告,但由于 XCode 是 Objective-C 寫的撵枢,OC 動態(tài)性太強大,導致在這么封閉的情況下民間還是可以做出各種插件精居,其核心開發(fā)方式就是:

dump 出 Xcode 所有頭文件锄禽,知道 Xcode 里有哪些類和接口。

通過頭文件方法名猜測方法的作用靴姿,swizzle 這些方法沃但,插入自己的代碼實現(xiàn)插件邏輯。

通過 NSNotificationCenter 監(jiān)聽各種事件的發(fā)生佛吓。

更詳細的開發(fā)教程網上有不少文章宵晚,有興趣的自行搜索吧恨旱。

10)Jspath 熱更新 也是使用運行時,jspatch 基本上算是黑科技坝疼,在線修復版本bug搜贤,微信都使用了這個技術,詳情百度“JSPatch”钝凶,此處省略30000字

______

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末仪芒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耕陷,更是在濱河造成了極大的恐慌掂名,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哟沫,死亡現(xiàn)場離奇詭異饺蔑,居然都是意外死亡,警方通過查閱死者的電腦和手機嗜诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門猾警,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隆敢,你說我怎么就攤上這事发皿。” “怎么了拂蝎?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵穴墅,是天一觀的道長。 經常有香客問我温自,道長玄货,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任悼泌,我火速辦了婚禮松捉,結果婚禮上,老公的妹妹穿的比我還像新娘券躁。我一直安慰自己惩坑,他們只是感情好掉盅,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布也拜。 她就那樣靜靜地躺著,像睡著了一般趾痘。 火紅的嫁衣襯著肌膚如雪慢哈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天永票,我揣著相機與錄音卵贱,去河邊找鬼滥沫。 笑死,一個胖子當著我的面吹牛键俱,可吹牛的內容都是我干的兰绣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼编振,長吁一口氣:“原來是場噩夢啊……” “哼缀辩!你這毒婦竟也來了?” 一聲冷哼從身側響起踪央,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤臀玄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畅蹂,有當地人在樹林里發(fā)現(xiàn)了一具尸體健无,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年液斜,在試婚紗的時候發(fā)現(xiàn)自己被綠了累贤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡少漆,死狀恐怖畦浓,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情检疫,我是刑警寧澤讶请,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站屎媳,受9級特大地震影響夺溢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜烛谊,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一风响、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丹禀,春花似錦状勤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焙矛,卻和暖如春葫盼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背村斟。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工贫导, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抛猫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓孩灯,卻偏偏與公主長得像闺金,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峰档,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • 閱讀了多篇運行時的文章,感覺都很不錯,從幾篇文章里面提取一些個人認為比較重要的,偏實戰(zhàn)的知識點的摘錄,另外還結合了...
    wg689閱讀 23,499評論 19 377
  • 對于從事 iOS 開發(fā)人員來說掖看,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,700評論 7 64
  • 一. RunTime簡介 RunTime簡稱運行時哎壳。OC就是運行時機制,也就是在運行時候的一些機制尚卫,其中最主要的是...
    xx_cc閱讀 13,659評論 43 170
  • 設計归榕,應該滿足用戶的手還是腦?毫無疑問腦啊吱涉。 直到有一天我iPad的鍵盤變成了這樣:中間斷掉了刹泄。 腦非常不習慣,因...
    黑白之間閱讀 171評論 0 2
  • 經過了一段時間的低落期怎爵,終于感覺又恢復正常了特石,或許找到了自己的方向。 在工作上鳖链,一定要發(fā)揮自己的優(yōu)勢姆蘸,將發(fā)酵的多學...
    alikey11閱讀 283評論 0 0