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