ios runtime(1)

來源:互聯網
上載者:User

標籤:

  • import
  • import

我們前面已經講過一篇runtime 原理,現在這篇文章主要介紹的是runtime是什麼以及怎麼用!希望對讀者有所協助!

首先,第一個問題, 
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的底層實現)

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

  • 遍曆一個類的所有成員變數(屬性)\所有方法 
    例如:我們需要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候,我們就會寫很多對應的代碼,但是如果使用了runtime就可以動態設定! 
    例如,PYPerson.h的檔案如下所示

    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;

@end

而PYPerson.m實現檔案的內容如下

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

@implementation PYPerson

  • (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,

ios runtime(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.