按住Option鍵(Windows鍵盤是Alt鍵)點(diǎn)擊你要查看的API名字,即可顯示快速幫助,點(diǎn)擊快速幫助里面的鏈接可以跳轉(zhuǎn)到詳細(xì)文檔。
成都創(chuàng)新互聯(lián)是一家專業(yè)提供縉云企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、html5、小程序制作等業(yè)務(wù)。10年已為縉云眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
直接開(kāi)啟文檔的辦法:
XCode菜單“Window” - “Organizer” - "Documentation"
runtime 在iOS中是“運(yùn)行時(shí)”的含義,是一套用c語(yǔ)言寫的api,很多人會(huì)用但是也僅僅用過(guò)最最常用的幾個(gè)函數(shù),這次,我將詳細(xì)的帶著大家探索下 runtime 的API,這一章就說(shuō)下 objc/runtime.h 這個(gè)文件里的 API ,并且我會(huì)把不適用于 ARC 和不支持64位的API剔除掉。
首先,我們先看一個(gè)簡(jiǎn)單的函數(shù):
這個(gè)函數(shù)是通過(guò)傳入 Class 類型的 cls 來(lái)得到 Class 的名字。那我們測(cè)試下這個(gè)函數(shù):
其中 [Person class] OC中獲得 Class 的方法,當(dāng)然,你也可以用 runtime 里面的 objc_getClass 等函數(shù),后面我也會(huì)講到。
運(yùn)行結(jié)果:
我們可以看到打印出來(lái)的結(jié)果就是類的名字。
上面既然用到了 [Person class] ,那我們就看下在 runtime 中 [Person class] 的替代函數(shù),都是通過(guò)名字來(lái)獲得 Class
那這三個(gè)有什么區(qū)別,從結(jié)論上講, objc_getClass 和 objc_lookUpClass 的效果是一致的,在最新的源碼里面,這兩個(gè)方法調(diào)用的底層也是一致的,當(dāng)你要找的類不存在的話,就返回nil,而 objc_getRequiredClass 里你要找的類不存在的話,就會(huì)崩潰。下面我們來(lái)測(cè)試下,我們創(chuàng)建一個(gè) Person 類。
運(yùn)行結(jié)果:
最后也確實(shí)崩潰了,所以大家使用 objc_getRequiredClass 這個(gè)函數(shù)時(shí)候要慎重小心。
除了用名字獲得類對(duì)象以外,還可以用實(shí)例對(duì)象來(lái)獲?。?/p>
我們測(cè)試下:
運(yùn)行結(jié)果:
完全沒(méi)問(wèn)題。
Class 不僅可以代表類對(duì)象,也可以代表元類對(duì)象,下面這個(gè)函數(shù)就是通過(guò)名字獲取元類對(duì)象。
如果你讀過(guò)源碼的話,你就會(huì)清楚元類對(duì)象儲(chǔ)存的是類方法,類對(duì)象儲(chǔ)存的是實(shí)例方法,在后面講到Method相關(guān)的API的時(shí)候,我們?cè)诰唧w講他們之間的區(qū)別。
講到元類對(duì)象,我們還要關(guān)注下這個(gè)函數(shù),
這個(gè)函數(shù)是用來(lái)判斷是否是元類對(duì)象。
運(yùn)行結(jié)果:
我們可以看到 objc_getMetaClass 生成才是元類對(duì)象, objc_getClass 生成的只是類對(duì)象。
那么有沒(méi)有函數(shù)區(qū)分類(元類)對(duì)象和實(shí)例對(duì)象呢?當(dāng)然有:
這個(gè)方法只要是類對(duì)象或者元類對(duì)象都會(huì)返回YES:
運(yùn)行結(jié)果:
當(dāng)然也可以獲得父類對(duì)象。
我們新建一個(gè)繼承 Person 的類 Student ,然后我們通過(guò) Student 類來(lái)獲得 Person 類。
運(yùn)行結(jié)果:
Student 的父類確實(shí)是 Person 。
我們知道OC里面可以強(qiáng)轉(zhuǎn)類型,當(dāng)然, runtime 里面也有相關(guān)方法
這個(gè)方法的意思是給一個(gè)實(shí)例對(duì)象設(shè)置新的類,返回舊的類
運(yùn)行結(jié)果:
我們可以看出開(kāi)始的時(shí)候 student 的類是 Student ,用了 object_setClass 后就是 Person 類了。
runtime 的動(dòng)態(tài)性還可以動(dòng)態(tài)新增類,下面四個(gè)函數(shù)分別表示為一個(gè)類分配內(nèi)存,注冊(cè)一個(gè)類,復(fù)制一個(gè)類,銷毀一個(gè)類
創(chuàng)建一個(gè)新類, superclass 是新類所繼承的類,如果為 nil , superclass 就默認(rèn)為根類,也就是 NSObject , extraBytes 是在類和元類對(duì)象的末尾為索引ivars分配的字節(jié)數(shù)。這一般是0, name 是新類的名字。
注冊(cè)類,如果這個(gè)類 objc_allocateClassPair 好了,就必須 objc_registerClassPair 才能使用。
這個(gè)方法在系統(tǒng)KVO的底層用過(guò),系統(tǒng)不推薦我們自己用。
objc_disposeClassPair 只能銷毀通過(guò) objc_allocateClassPair 創(chuàng)建的類。
我們寫個(gè)demo來(lái)測(cè)試這些方法, objc_duplicateClass 官方不建議使用,那么我們就不測(cè)試這函數(shù)。
運(yùn)行結(jié)果:
我們可以知道如果僅僅只是 objc_allocateClassPair 的話,你是找不到這個(gè)類的,必須再 objc_registerClassPair 才可以找到, objc_disposeClassPair 則是把類銷毀掉,所以再實(shí)際開(kāi)發(fā)中,如果我們不再使用自建類的時(shí)候,就要及時(shí)銷毀,節(jié)省內(nèi)存。
下面兩個(gè)函數(shù)是關(guān)于整個(gè)工程的類列表的函數(shù):
這個(gè)函數(shù)是獲得所有注冊(cè)類的列表,我們?cè)囉孟拢?/p>
運(yùn)行結(jié)果:
我們看到注冊(cè)的類有15765個(gè)。
objc_getClassList 也是獲取注冊(cè)類的方法.
第一個(gè)參數(shù) buffer 已分配好內(nèi)存空間的數(shù)組指針, bufferCount 是數(shù)組的個(gè)數(shù),如果 bufferCount 的數(shù)量小于實(shí)際的數(shù)組數(shù)量,那么 buffer 返回的是所有數(shù)組集合的任意一個(gè)子類。如果 buffer 為NULL,那么 bufferCount 為0。無(wú)論那種情況,返回結(jié)果都是當(dāng)前注冊(cè)類的總數(shù)。
運(yùn)行結(jié)果:
返回類實(shí)例的大小。
運(yùn)行結(jié)果
一個(gè)沒(méi)有變量或?qū)傩缘睦^承于NSObject的類占有8個(gè)字節(jié)。
還有個(gè)方法是:
這是一個(gè)創(chuàng)建實(shí)例的方法, cls 是要?jiǎng)?chuàng)建的類, extraBytes 是額外的字節(jié)內(nèi)存,用來(lái)存儲(chǔ)類定義中的實(shí)例變量之外的其他實(shí)例變量。在源碼中 alloc 方法底層就是用的這個(gè)函數(shù)。那么,我們用這個(gè)函數(shù)來(lái)初始化 Person 類:
運(yùn)行結(jié)果:
確實(shí)能夠成功創(chuàng)建出來(lái)。
最后剩下兩個(gè)方法:
這兩個(gè)方法都和 version 有關(guān),這個(gè)version在實(shí)際中我也沒(méi)發(fā)現(xiàn)用處,可能是在改變類的變量或者方法時(shí)給定一個(gè)標(biāo)識(shí).
運(yùn)行結(jié)果
下面我們將使用runtime里面最最常用的api,也就是給分類綁定對(duì)象,這里,我們先了解下,一個(gè)枚舉:
objc_AssociationPolicy 是一個(gè)枚舉,里面的枚舉值分別代表要添加的屬性的修飾類型。
OBJC_ASSOCIATION_ASSIGN 相當(dāng)于 weak
OBJC_ASSOCIATION_RETAIN_NONATOMIC 相當(dāng)于 strong 和 nonatomic
OBJC_ASSOCIATION_COPY_NONATOMIC 相當(dāng)于 copy 和 nonatomic
OBJC_ASSOCIATION_RETAIN 相當(dāng)于 strong 和 atomic
OBJC_ASSOCIATION_COPY 相當(dāng)于 copy 和 atomic
關(guān)于分類的runtime函數(shù),主要有下面3個(gè):
含義分別為設(shè)置關(guān)聯(lián)對(duì)象,獲得關(guān)聯(lián)對(duì)象,刪除關(guān)聯(lián)對(duì)象。
我們知道如果在分類的 .h 文件設(shè)置屬性并沒(méi)有用,調(diào)用的時(shí)候會(huì)發(fā)生閃退,這是因?yàn)橄到y(tǒng)并沒(méi)有自動(dòng)為屬性生成 Set 和 Get 方法,所以,我們用上面三個(gè)方法來(lái)手動(dòng)關(guān)聯(lián)對(duì)象。
我們創(chuàng)建一個(gè) Person 的分類 Person+Actor.h ,在.h文件里新建一個(gè)新屬性 @property(nonatomic, assign)float actingSkill 而不做其他任何處理,這時(shí)候, .m 文件就會(huì)有警告。
這時(shí)候就綁定好了。
在 ViewController 里面去使用下這個(gè)屬性
運(yùn)行結(jié)果:
說(shuō)明set和get方法都成功了。
那么還有一個(gè) objc_removeAssociatedObjects 方法還沒(méi)用,這個(gè)方法是解除綁定,為了測(cè)試這個(gè)效果,我們?cè)赩iewController里面 touchesBegan 里面去調(diào)用這個(gè)方法。
運(yùn)行結(jié)果:
之前綁定的結(jié)果被移除了。
今天我們這一篇就講到這, runtime 還有很多其他的用法我們下一篇見(jiàn)。
對(duì)了,這個(gè)是 demo ,喜歡的可以點(diǎn)個(gè)星。
如果你用的是mac,下載一個(gè) xcode 下,它包含了ios iWatch mac 的開(kāi)發(fā)sdk,,直接看就可以了,
如果不是,登錄 develop.apple.com 看也是可以的
本文名稱:ios開(kāi)發(fā)api文檔,ios sdk開(kāi)發(fā)知識(shí)
網(wǎng)頁(yè)網(wǎng)址:http://chinadenli.net/article38/dsdejpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、小程序開(kāi)發(fā)、網(wǎng)站排名、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)