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字
______