RunTime

iOS中的runtime應用

字數999閱讀4975評論11喜歡22

1.什么是runtime?

runtime是一套底層的C語言API,包含很多強大實用的C語言數據類型和C語言函數,平時我們編寫的OC代碼,底層都是基于runtime實現的。

2.runtime有什么作用?

1.能動態產生一個類,一個成員變量,一個方法

2.能動態修改一個類,一個成員變量,一個方法

3.能動態刪除一個類,一個成員變量,一個方法

3.常用的頭文件

#import包含對類、成員變量、屬性、方法的操作#import包含消息機制

4.常用方法

class_copyIvarList()返回一個指向類的成員變量數組的指針

class_copyPropertyList()返回一個指向類的屬性數組的指針

注意:根據Apple官方runtime.h文檔所示,上面兩個方法返回的指針,在使用完畢之后必須free()。

ivar_getName()獲取成員變量名-->C類型的字符串property_getName()獲取屬性名-->C類型的字符串-------------------------------------typedef struct objc_method *Method;class_getInstanceMethod() class_getClassMethod()以上兩個函數傳入返回Method類型---------------------------------------------------method_exchangeImplementations()交換兩個方法的實現

5.runtime在開發中的用途

1.動態的遍歷一個類的所有成員變量,用于字典轉模型,歸檔解檔操作

代碼如下:

- (void)viewDidLoad {? ? ? [superviewDidLoad];/** 利用runtime遍歷一個類的全部成員變量

1.導入頭文件? ? */unsignedintcount =0;/** Ivar:表示成員變量類型 */Ivar *ivars = class_copyIvarList([BDPerson class], &count);//獲得一個指向該類成員變量的指針for(inti =0; i < count; i ++) {//獲得IvarIvar ivar = ivars[i];//根據ivar獲得其成員變量的名稱--->C語言的字符串constchar*name = ivar_getName(ivar);NSString*key = [NSStringstringWithUTF8String:name];NSLog(@"%d----%@",i,key);}}

運行結果如下:

成員變量遍歷輸出結果.png

獲取一個類的全部屬性:

獲取類的屬性的代碼實現.png

結果如下:

輸出結果.png

應用場景:

可以利用遍歷類的屬性,來快速的進行歸檔操作。

將從網絡上下載的json數據進行字典轉模型。

注意:歸檔解檔需要遵守協議,實現以下兩個方法- (void)encodeWithCoder:(NSCoder*)encoder{//歸檔存儲自定義對象unsignedintcount =0;//獲得指向該類所有屬性的指針objc_property_t *properties =? ? class_copyPropertyList([BDPerson class], &count);for(inti =0; i < count; i ++) {//獲得objc_property_t property = properties[i];//根據objc_property_t獲得其屬性的名稱--->C語言的字符串constchar*name = property_getName(property);NSString*key = [NSStringstringWithUTF8String:name];//? ? ? 編碼每個屬性,利用kVC取出每個屬性對應的數值[encoder encodeObject:[selfvalueForKeyPath:key] forKey:key];? }}- (instancetype)initWithCoder:(NSCoder*)decoder{//歸檔存儲自定義對象unsignedintcount =0;//獲得指向該類所有屬性的指針objc_property_t *properties = class_copyPropertyList([BDPerson class], &count);for(inti =0; i < count; i ++) {? ? ? ? ? ? ? objc_property_t property = properties[i];//根據objc_property_t獲得其屬性的名稱--->C語言的字符串constchar*name = property_getName(property);NSString*key = [NSStringstringWithUTF8String:name];//解碼每個屬性,利用kVC取出每個屬性對應的數值[selfsetValue:[decoder decodeObjectForKey:key] forKeyPath:key];? }returnself;}

二、交換方法

通過runtime的method_exchangeImplementations(Method m1, Method m2)方法,可以進行交換方法的實現;一般用自己寫的方法(常用在自己寫的框架中,添加某些防錯措施)來替換系統的方法實現,常用的地方有:

在數組中,越界訪問程序會崩,可以用自己的方法添加判斷防止程序出現崩潰數組或字典中不能添加nil,如果添加程序會崩,用自己的方法替換系統防止系統崩潰

...

代碼實現如下:

運行程序崩潰.png

添加一個分類實現方法交換.png

再次運行剛才的程序:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 對于從事 iOS 開發人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,732評論 7 64
  • 我們常常會聽說 Objective-C 是一門動態語言,那么這個「動態」表現在哪呢?我想最主要的表現就是 Obje...
    Ethan_Struggle閱讀 2,231評論 0 7
  • 轉載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 768評論 0 2
  • 本文詳細整理了 Cocoa 的 Runtime 系統的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 824評論 0 4
  • 本文轉載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 794評論 0 1