iOS的runtime黑魔法

runtime(運行時) 官方:iOS黑魔法面試

1.OC運行時候轉化爲了runtime運行時候的C語言代碼swift

2.是一套C語言的API (C語言函數庫)數組

 

動態庫/靜態庫安全

靜態庫:獨立庫  一個項目中包含了這個庫網絡

動態庫:共享庫   一個項目中不包含庫app

 

iOS僞後臺 :應用程序被掛起    只有特定的幾個能夠運行(loaction   應用   網絡通話)只有這三種才能夠框架

iOS是僞後臺 其實也就是單進程  同一時間只有一個app運行   故此時此刻 因此通常是蘋果是靜態庫函數

 

 

2014年之前 iOS程序裏面是不支持動態庫的,庫克開放了不少動態庫性能

swift的出現了開始  動態庫出現了在了iOS的世界   蘋果的一大突破spa

iOS要慢慢的開源  

 

OC的程序是怎麼變成C語言的代碼   ?????

OS X  --command 命令行----

hs—cd到main.m目錄   

手動變異   hs clang 變異完了多了一個main.cpp  你能夠看到一個代碼

 

經過objc_msgSend 發送了一個名字爲 sel_egisterName的消息

 

如何手寫runtime運行時代碼?????

 

 

 

runtime有什麼做用????????????

1.runtime是一個OC的底層實現 ,用起來麻煩  性能很高 並且它能完成OC永遠沒法完成的功能

2.程序運行的過程當中,幫你動態的建立一個類 

3,在程序的運行過程當中   動態爲某個類添加屬性 和方法  修改屬性 和方法

4.遍歷一個類的全部成員變量(NB的框架用到了,字典轉模型框架MJExtension和JSONModel用到了)

大量用到了runtime運行時

5.runtime重要使用場景 歸檔

 

 

 

 

 

egg:如何去使用runtime ?????

兩個門牌號頭文件: <objc/runtime>   <objc/message>

runtime必備常識:1. Method 成員方法         2. Ivar  成員屬性  

其實還有分類和屬性    

打開Xcode       建立一個iOS應用         

 

步驟:

1.導入<objc/runtime>   <objc/message>頭文件

2.能夠去修改頭文件單加註釋  通常不要修改        UIKIt框架能夠作一個備份 進去了吧Header能夠拷貝一份

3.進去官方文檔  runtime --Objec-c Runtime Reference

裏面有不少方法    ---class_copyIvarList 成員變量列表拷貝  返回值是一個 Ivar *  在C語言裏面 Ivar是一個結構體   這個是一個結構體指針     指針的操做和數組差很少   給他一個角標的會指向不一樣的東西    C語言指針的特點和特色    

 

還有個函數     ---class_copyMethodList

建立一個Person 裏面有一些屬性

 

三種方法去拿到類的屬性  

1.倒入頭文件   

2.NSClassFromString(經過字符串返回class) 這個在main.m文件中

3。這個方法不用導入頭文件就能夠    用一個指針傳遞 Outcount 經過指針去改變對應內存中count的值

 

 

獲取到了成員變量的個數

接下來拿到每個成員變量

 

連對象都沒有建立 就能夠拿到她的成員變量 

ivars[0]返回一個 Ivar   *ivar = ivars[0];

Ivar是Runtime的成員變量    Ivar_getName(ivar)不會產生一個數據越界的問題   

Ivar_getName(ivar)能獲得一個const char * 類型  能夠打印出來的他的屬性  

 

字典轉模型  遍歷的每個屬性的萬一你的

 

 

最後進去一個Person的.m文件    外界通常是不能訪問的 

這樣你在.m加上interface  你能夠隨意加上屬性  而後你就能夠經過runtime在裏面T拿到添加的屬性

 

你能夠對PageControl控件的6個屬性 

你想把pageControl下面的小點點 修改爲正方形  你怎麼修改?????

你能夠的拿到她的屬性用KVC  setvalueforkey   私有的API不能上線 可是runtime能夠上線     pagrcontrol去改的話應該能夠上線

 

 

歸檔的runtime使用

command +L  加上 你想跳的行

 

如何將屬性Person *p的p歸檔

歸檔的話先拿到沙盒路徑        

NSString *DocPath = NSSsearchPath。。。。。。。。  返回了數組   裏面一堆路徑 而後來易個first或者last

一個項目中Docment只有一個  

 

 

歸檔   1個協議和2個方法

當你的項目卸載了  你能夠作一個接檔的過程就能夠拿出來你存儲的數據   不安全 這是個數據的持久化

如何將歸檔用到極致????????

歸檔的前提是  歸檔一個OC對象的底層原理是  

1.OC對象有屬性   將屬性拆分出來   拆分爲字典     NSString :Value       

  而後將這些字典  KVC寫入文件 

 

2.在實際開發中通常是去歸檔模型  裏面的屬性太多了  怎麼去寫

如何讓歸檔變得很簡單???????

這個時候你能夠新建一個類   HankCoding 

HankCoding裏面去遵照一個協議  (自定義的協議)   而後去實現兩個方法

這個裏面的話你能夠用runtime       導入頭文件

在這個裏面實現升級

 

當使用C語言函數的時候   應該new   Creat 和Copy 應該要釋放   你因該注意到一個的內存管理的問題    不接受ARC

指針你幹不掉   你應該在最後加上free(ivars)

 

這個時候你能夠去刪掉原來的協議   去繼承 HKCodeing    HKCodeing繼承NSCoding

這個時候的字節數  裏面有數據

 

 

 

 

 

面試題:

如何讓C語言的函數有多個返回值???????

1.能夠經過返回一個數組指針  但考你指針傳遞

惟一的方法  讓它的指針做爲函數的參數

相關文章
相關標籤/搜索