1.什么是運行時?
1>運行時是一套純C語言的API(純C語言庫).
2>編譯器最終都會將 **OC代碼** 轉化為 **運行時代碼**
3>利用運行時可以做很多底層的操作,比如
* 動態添加對象的成員變量和成員方法.
* 動態交換兩個方法的實現(特別是交換系統自帶的方法).
* 獲得某個類的所有成員方法/所有成員變量.
2. 如何應用運行時?
1>將某些代碼轉化為運行時代碼:探究底層,比如block的實現原理.
2>攔截系統自帶的方法調用,比如攔截`imageNamed:`/`viewDidLoad`/`alloc`
3>實現字典和模型的自動轉換.
4>實現分類也可以增加屬性(每個對象的屬性互不干擾).
5>實現NSCoding屬性的自動歸檔解檔.
3.運行時常用到的函數
1><objc/runtime.h>
交換兩個方法的實現
- Method class_getClassMethod(Class cls, SEL name)
獲得某個類的類方法.
- Method class_getInstanceMethod(Class cls, SEL name)
獲得某個類的對象方法.
- Method class_getInstanceMethod(Class cls, SEL name)
交換兩個方法的實現.
實現分裂添加屬性
- void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
* 將value和對象關聯起來(將值value存儲到對象的object中).
* 參數key:將來可以通過key取出這個存儲的值
* 參數policy:存儲策略(assign,copy,retain)
- id objc_getAssociatedObject(id object, const void *key)
利用參數key把對象object中存儲的對應值取出來.
實現NSCoding屬性的自動歸檔結檔.
- Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
獲得某個類的所有成員變量(outCount會返回成員變量的總數).
- const char *ivar_getName(Ivar v)
獲得成員變量的名字.
- const char *ivar_getTypeEncoding(Ivar v)
獲得成員變量的屬性.
- void free(void *)
釋放內存(當C語言函數中包含了copy/create/retain/new等詞語,那么就需要在最后釋放資源)
2> <objc/message.h>
- void objc_msgSend(void /* id self, SEL op, ... */ )
給某個對象發送某個消息.
4,.解決項目配置的大部分報錯問題(感覺莫名其妙的問題)
1.先嘗試刪除Xcode編譯后的緩存
Xcode - Preference - Locations - Derived Data
2. 清除Xcode的用戶操作數據
項目名.xcodeproj - 右擊 - 顯示包內容 - xcuerdata文件夾
3. 打開project.pbxproj 文件,查看是否有冗余內容,替換為新內容
4. 打開project.xcworkspace文件,查看是否有冗余內容,替換為新內容.