runtime 執行時機制1

2021-07-10 03:42:54 字數 3826 閱讀 7408

unsignedint outcount;   

int i;   

objc_property_t *pproperty = class_copypropertylist([uidatepicker class], &outcount);

for (i = outcount -1; i >= 0; i--)  

nslog(@"%@====%@",getpropertynamestring,getpropertyname);  

} runtime : 執行時機制

1.是什麼

1> runtime是一套比較底層的純c語言api, 屬於1個c語言庫, 包含了很多底層的c語言api

2> 平時編寫的oc**, 在程式執行過程中, 其實最終都是轉成了runtime的c語言**, runtime算是oc的幕後工作者

3> 舉例:

oc :

[[mjperson alloc] init]

runtime :訊息機制

objc_msgsend(objc_msgsend("mjperson" , "alloc"), "init")

2.用過麼? 怎麼用?

1> runtime是屬於oc的底層, 可以進行一些非常底層的操作(用oc是無法現實的, 不好實現)

* 在程式執行過程中, 動態建立乙個類(比如kvo的底層實現,kvc的底層)實際上整個oc都會用到runtime

* 在程式執行過程中, 動態地為某個類新增屬性\方法, 修改屬性值\方法

* 遍歷乙個類的所有成員變數(屬性)\所有方法

3.相關的標頭檔案和函式

1> 標頭檔案 *

*

2> 相關應用

* nscoding(歸檔和解檔, 利用runtime遍歷模型物件的所有屬性)

* 字典--> 模型 (利用runtime遍歷模型物件的所有屬性, 根據屬性名從字典中取出對應的值, 設定到模型的屬性上)

* kvo(利用runtime動態產生乙個類)

* 用於封裝框架(想怎麼改就怎麼改)

3> 相關函式

* objc_msgsend : 給物件傳送訊息

* class_copymethodlist : 遍歷某個類所有的方法

* class_copyivarlist : 遍歷某個類所有的成員變數

* class_.....

4.必備常識

1> ivar : 成員變數

2> method : 成員方法

#import "mjviewcontroller.h"

#import "mjperson.h"

#import "mjdog.h"

#import

#import

@inte***ce mjviewcontroller ()

@property (nonatomic, strong) mjperson *person;

@property (nonatomic, strong) mjdog *dog;

@end

@implementation mjviewcontroller

- (void)viewdidload

self.person = [[mjperson alloc] init];

self.dog = [[mjdog alloc] init];

//    nslog(@"%@ %@", self.person.class, self.person)

// 讓self.dog監聽self.person的age屬性的改變,當人的屬性改變了,呼叫狗的方法

[self.person addobserver:self.dog forkeypath:@"age" options:0 context:nil];

// foundation

//    nsdictionary

//    nsarray

//    nsstring

//    nsarray *array = [nsarray array];

//    array.count;

// core foundation

//    cfdictionaryref

//    cfarrayref

//    cfstringref

//    cfarrayref array2 = cfarraycreate(null, null, 10, null);

//    cfarraygetcount(array2);

nsstring *str = @"dfshgfkhgsdkhgf";

//    (__bridge <#type#>)<#expression#>

// 在foundation和core foundation資料之間進行轉換(沒有做任何的記憶體管理, 只是簡單的轉換)

//    nsarray *array1 = [[nsarray alloc] init];

//   

//    cfarrayref array2 = (__bridge_retained cfarrayref)array1;

//   

//    [array1 release];

//    (__bridge_retained <#cf type#>)<#expression#>

// foundation --> core foundation

//    (__bridge_transfer <#objective-c type#>)<#expression#>

// core foundation --> foundation

//    cfarrayref array3 = cfarraycreate(null, null, 10, null);

//   

//    nsarray *array4 = (__bridge_transfer nsarray *)array3;

//   

//    cfrelease(array3); }

- (void)touchesbegan:(nsset *)touches withevent:(uievent *)event

@end

#import

@inte***ce mjperson : nsobject

@property (nonatomic, assign) int age;

@property (nonatomic, assign) int height;

@property (nonatomic, copy) nsstring *name;

//@property (nonatomic, assign) int age3;

//@property (nonatomic, assign) int age4;

//@property (nonatomic, assign) int age5;

//@property (nonatomic, assign) int age6;

@end

//  mjperson.m

#import "mjperson.h"

#import

@implementation mjperson

// 歸檔

- (void)encodewithcoder:(nscoder *)encoder

free(ivars); }

// 解檔

- (id)initwithcoder:(nscoder *)decoder

free(ivars); }

return self; }

@end

runtime 執行時機制

首先,第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?這個問題我就不跟大家繞彎子了,直接告訴大家,runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了runtime的c語言 r...

runtime 執行時機制

必備常識 1.ivar 成員變數 2.method 成員方法相關應用 1.nscoding 歸檔和解檔,利用runtime遍歷模型物件的所有屬性 2.字典 模型 利用runtime遍歷模型物件的所有屬性,根據屬性名從字典中取出對應的值,設定到模型的屬性上 3.kvo 利用runtime動態產生乙個類...

runtime 執行時機制

runtime 執行時機制 一 runtime是什麼 1 runtime是乙個全動態語言,是基於c語言的庫,裡面包含了很多底層的c語言函式。2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc方法的底層實現,換句話說oc的實現也就是runtime的底...