關於對OC運行時機制的理解

首先,第一個問題, 
1》runtime實現的機制是什麼,怎麼用,通常用於幹嗎? 
這個問題我就不跟你們繞彎子了,直接告訴你們, 
runtime是一套比較底層的純C語言API, 屬於1個C語言庫, 包含了不少底層的C語言API。 
在咱們平時編寫的OC代碼中, 程序運行過程時, 其實最終都是轉成了runtime的C語言代碼, runtime算是OC的幕後工做者 
好比說,下面一個建立對象的方法中, 
舉例: 
OC : 
[[MJPerson alloc] init] 
runtime : 
objc_msgSend(objc_msgSend(「MJPerson」 , 「alloc」), 「init」)框架

第二個問題 
runtime 用來幹什麼呢??用在那些地方呢?怎麼用呢? 
runtime是屬於OC的底層, 能夠進行一些很是底層的操做(用OC是沒法現實的, 很差實現)函數

  • 在程序運行過程當中, 動態建立一個類(好比KVO的底層實現)學習

  • 在程序運行過程當中, 動態地爲某個類添加屬性\方法, 修改屬性值\方法ui

  • 遍歷一個類的全部成員變量(屬性)\全部方法 
    例如:咱們須要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候,咱們就會寫不少對應的代碼,可是若是使用了runtime就能夠動態設置! 
    例如,PYPerson.h的文件以下所示atom

    import

@interface PYPerson : NSObject 
@property (nonatomic, assign) int age; 
@property (nonatomic, assign) int height; 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, assign) int age2; 
@property (nonatomic, assign) int height2; 
@property (nonatomic, assign) int age3; 
@property (nonatomic, assign) int height3; 
@property (nonatomic, assign) int age4; 
@property (nonatomic, assign) int height4;spa

@end.net

而PYPerson.m實現文件的內容以下code

<!-- lang: cpp --> #import "PYPerson.h" 

import

@implementation PYPersonxml

  • (void)encodeWithCoder:(NSCoder )encoder 

    unsigned int count = 0; 
    Ivar 
    ivars = class_copyIvarList([PYPerson class], &count);對象

    for (int i = 0; i<count; i++) {

    // 取出i位置對應的成員變量 Ivar ivar = ivars[i]; // 查當作員變量 const char *name = ivar_getName(ivar); // 歸檔 NSString *key = [NSString stringWithUTF8String:name]; id value = [self valueForKey:key]; [encoder encodeObject:value forKey:key]; 

    }

    free(ivars); 
    }

  • (id)initWithCoder:(NSCoder *)decoder 

    if (self = [super init]) {

    unsigned int count = 0; Ivar *ivars = class_copyIvarList([PYPerson class], &count); for (int i = 0; i<count; i++) { // 取出i位置對應的成員變量 Ivar ivar = ivars[i]; // 查當作員變量 const char *name = ivar_getName(ivar); // 歸檔 NSString *key = [NSString stringWithUTF8String:name]; id value = [decoder decodeObjectForKey:key]; // 設置到成員變量身上 [self setValue:value forKey:key]; } free(ivars); 


    return self; 
    }

@end

這樣咱們能夠看到歸檔和解檔的案例實際上是runtime寫下的

學習,runtime機制首先要了解下面幾個問題 
1相關的頭文件和函數 
1> 頭文件


  • 利用頭文件,咱們能夠查看到runtime中的各個方法!

2> 相關應用

  • NSCoding(歸檔和解檔, 利用runtime遍歷模型對象的全部屬性)
  • 字典 –> 模型 (利用runtime遍歷模型對象的全部屬性, 根據屬性名從字典中取出對應的值, 設置到模型的屬性上)
  • KVO(利用runtime動態產生一個類)
  • 用於封裝框架(想怎麼改就怎麼改) 
    這就是咱們runtime機制的只要運用方向

3> 相關函數

  • objc_msgSend : 給對象發送消息
  • class_copyMethodList : 遍歷某個類全部的方法
  • class_copyIvarList : 遍歷某個類全部的成員變量
  • class_….. 
    這是咱們學習runtime必須知道的函數!

4.必備常識 1> Ivar : 成員變量 2> Method : 成員方法 從上面例子中咱們看到咱們定義的成員變量,若是要是動態建立方法,可使用Method,

相關文章
相關標籤/搜索