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.能夠經過返回一個數組指針 但考你指針傳遞
惟一的方法 讓它的指針做爲函數的參數