runtime 執行時機制

2021-08-20 01:57:44 字數 3654 閱讀 9484

(1)runtime簡稱執行時。oc就是「執行時機制」,也就是在執行時候的一些機制,其中最主要的是訊息機制

對於c語言,「函式的呼叫在編譯的時候會決定呼叫哪個函式」

對於oc的函式,屬於「動態呼叫過程」,在編譯的時候並不能決定真正呼叫哪個函式,只有在真正執行的時候才會根據函式的名稱找到對應的函式來呼叫

在編譯階段,oc可以「呼叫任何函式」,即使這個函式並未實現,只要宣告過就不會報錯

在編譯階段,c語言呼叫「未實現的函式」就會報錯

(2)作用:1  傳送訊息

方法呼叫的本質,就是讓物件傳送訊息

objc_msgsend,只有物件才能傳送訊息,因此以objc開頭

使用`訊息機制`前提,必須匯入#import

clang -rewrite-objc main.m 檢視最終生成**

什麼時候需要用到

runtime

(訊息機制):不得不用

runtime

訊息機制,可以幫我呼叫私有方法

//建立person物件

person *p = [[person alloc] init];

//呼叫物件方法

[p eat];

//本質:讓物件傳送訊息

objc_msgsend(p, @selector(eat));

//呼叫類方法的方式:兩種

//第一種通過類名呼叫

[person eat];

//第二種通過類物件呼叫

[[person class] eat];

//用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫

//本質:讓類物件傳送訊息

objc_msgsend([person class], @selector(eat));

//方法呼叫流程:

//物件方法儲存在類物件的方法列表,類方法儲存在元類中方法列表

//1 通過isa去對應的類中查詢

//2 註冊方法編號

//3 根據方法編號去查詢對應方法

//4 找到只是最終函式實現位址,根據位址去方法區呼叫對應函式

//person *p = [person alloc];

person *p = objc_msgsend(objc_getclass("person"), sel_registername("alloc"));

//p = [p init];

p = objc_msgsend(p, sel_registername("init"));

//呼叫有引數的方法

objc_msgsend(p, @selector(run:),20);

2  交換方法

開發使用場景:系統自帶的方法功能不夠,給系統自帶的方法擴充套件一些功能,並且保持原有的功能。

方式一:繼承系統的類,重寫方法

方式二:使用runtime,交換方法

@implementation viewcontroller

- (void)viewdidload

@end

//uiimage分類

@implementation uiimage (image)

//載入分類到記憶體的時候呼叫

+ (void)load

//不能在分類中重寫系統方法imagenamed,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super.

//既能載入又能列印

+ (instancetype)imagewithname:(nsstring *)name

return image;

}@end

3  動態新增方法

開發使用場景:如果乙個類方法非常多,載入類到記憶體的時候也比較耗費資源,需要給每個方法生成對映表,可以使用動態給某個類,新增方法解決

經典面試題:有沒有使用performselector,什麼時候使用?(動態新增方法的時候)

runtime(動態新增方法):oc都是懶載入機制,只要乙個方法實現了,就會馬上新增到方法列表中

@implementation viewcontroller

- (void)viewdidload

@end

@implementation person

//任何方法預設都有兩個隱式引數,self,_cmd

//_cmd:當前方法的方法編號

void aaa(id self, sel _cmd, nsnumber *meter)

//什麼時候呼叫:只要乙個物件呼叫了乙個未實現的方法就會呼叫這個方法,進行處理

//作用:動態新增方法,處理未實現

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}@end

4  給分類新增屬性

原理:給乙個類宣告屬性,其實本質就是給這個類新增關聯,並不是直接把這個值的記憶體空間新增到類存空間

@implementation viewcontroller

- (void)viewdidload

@end

//nsobject+property.h

@implementation nsobject (property)

//static nsstring *_name;

- (void)setname:(nsstring *)name

- (nsstring *)name

@end

5  字典轉模型

@implementation viewcontroller

- (void)viewdidload

//測試資料

nslog(@"%@ %@",_statuses,[_statuses[0] user]);

}@end

//nsobject+model.h

@implementation nsobject (model)

+ (instancetype)modelwithdict:(nsdictionary *)dict

;        //用乙個ivar *指標指向陣列第乙個元素

ivar *ivarlist = a;

//根據指標訪問陣列第乙個元素

ivarlist[0];

*/unsigned int count;

//獲取類中的所有成員屬性

ivar *ivarlist = class_copyivarlist(self, &count);

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

} //**轉換:nsarray中也是字典,把陣列中的字典轉換成模型.

//判斷值是否是陣列

if ([value iskindofclass:[nsarray class]])

//把模型陣列賦值給value

value = arrm; }}

if (value)

}return objc;

}@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的底...