簡(jiǎn)書上已經(jīng)有了很多對(duì)runtime講解的文章逼裆,有深有淺,但大多有一個(gè)共同的特點(diǎn)赦政,它們都好長(zhǎng)啊……
有句話叫書到用時(shí)方恨少胜宇,現(xiàn)在很多人還是這樣(包括作者),可能要用到runtime的時(shí)候才想到去看一看恢着,但是面對(duì)那么長(zhǎng)的文章桐愉,有的時(shí)候看幾眼就看不下去了,所以我在這里就簡(jiǎn)單的講一下runtime可以拿來干什么掰派。
1.用自定義函數(shù)和官方函數(shù)進(jìn)行函數(shù)對(duì)換
首先創(chuàng)建好一個(gè)新項(xiàng)目从诲,在這個(gè)項(xiàng)目里創(chuàng)建一個(gè)分類
分類.m文件中寫好代碼
該代碼無論純代碼開發(fā)還是故事版開發(fā)都可用。
上面的代碼意思是拿自定義函數(shù)runtime_setFont和UILabel官方函數(shù)setFont進(jìn)行對(duì)換碗淌。
這樣在你設(shè)置字體的時(shí)候會(huì)自動(dòng)根據(jù)屏幕寬度來等比修改你的字體大小盏求,而你只需要設(shè)置好一個(gè)基于320屏幕寬度的字體大小值。假如你使用的是默認(rèn)的字體大小17亿眠,它也會(huì)自動(dòng)調(diào)用一次setFont函數(shù)來確保適配功能碎罚。
2.在官方類上添加你的自定義屬性
依然是創(chuàng)建一個(gè)NSObject的分類,在.h文件中加入自定義屬性
@property(nonatomic,strong)NSString* tag_str;
在.m文件中寫好代碼
在你想要使用它的文件中引入這個(gè)分類就可以了纳像。
以上用runtime的API實(shí)現(xiàn)的功能實(shí)際上給人一種殺雞焉用宰牛刀的感覺荆烈,因?yàn)樗鼈兛瓷先ビ美^承來實(shí)現(xiàn)會(huì)更安全,更直接一點(diǎn)竟趾,作者在這里也只是用這種方式來讓大家自己去理解這些API的功能和用法憔购,實(shí)際上作者本身也更支持用繼承。
3.獲取某個(gè)類的所有成員變量
這個(gè)功能可以說真真確確的必須只能用runtime來實(shí)現(xiàn)了岔帽。
這段代碼先創(chuàng)建了一個(gè)unsigned int對(duì)象玫鸟,之后在class_copyIvarList函數(shù)中傳入它的地址,這樣它的值就會(huì)被改成AppDelegate類的成員變量的數(shù)量犀勒,之后在for循環(huán)中一個(gè)一個(gè)log出每個(gè)成員變量的名字還有類型屎飘。
它最明顯的用途是拿來實(shí)現(xiàn)歸檔解檔,MJExtension就是用它來實(shí)現(xiàn)一條代碼歸檔解檔的贾费,非常的方便钦购。
demo地址:https://github.com/zizhouwang/RuntimeBeginProbe
以上所有講解都只是簡(jiǎn)明述意,作者也不是很明白它們的原理褂萧,知其然不知其所以然最大的問題就是當(dāng)使用它出現(xiàn)問題時(shí)并不知道如何去修正押桃,所以還是希望大家去看一看大神的文章,透徹了解runtime的工作原理导犹。