ios Runtime 執行時機制

2021-08-02 02:40:13 字數 3764 閱讀 5993

1.runtime 叫做執行時機制,其實oc也有執行時機制-訊息機制!我們oc中呼叫方法的時候,其實底層就是發訊息。

2.c語言中,函式的呼叫在編譯的時候會決定呼叫哪個函式。

3.oc當中的函式,屬於動態呼叫的過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在執行的時候才會決定呼叫函式。

那麼,現在就可以得出:

(1)在編譯階段,oc可以呼叫任何函式,即使這個函式病沒有實現,只要宣告了就不會報錯。

(2)在編譯階段,c語言呼叫未實現的函式就一定會報錯!

那麼,現在應該清楚執行時機制的特性了吧。

**1.傳送訊息

(1)上面也說了,其實方法呼叫的本質,就是讓物件發訊息(訊息機制)。

(2)objc_msgsend,只有物件才能發訊息,故以objc開頭。

(3)使用訊息機制,必須匯入#import

#import "viewcontroller.h"

@inte***ce

viewcontroller ()

@end

@implementation

viewcontroller

- (void)viewdidload

#import "uiimage+changeimage.h"

#import

@implementation

uiimage (changeimage)

//這個load 載入分類的時候第乙個呼叫

+(void)load

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

+ (instancetype)imagewithname:(nsstring *)nameelse

return image;

}

3.動態新增方法

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

(2)簡單的使用:

4.給分類新增屬性

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

下面的是我類別裡面的**:

#import

"uiview+personification.h"

#import

//定義關聯的屬性名字 key

static

const

char *key = "***";

@implementation uiview (personification)

-(nsstring *)***

- (void)set***:(nsstring * )***

@end

5.字典轉模型

(1)我們寫模型屬性,需要和字典裡的key一一對應

(2)那麼問題來了:乙個個的生成模型屬性,很慢?

(3)解決方案:能否自動的根據乙個字典,生成對應的屬性呢?

(4)實施方案:提供乙個分類,專門根據字典生成對應的屬性字串。

#import "nsobject+ly_category.h"

@implementation nsobject (ly_category)

//自動列印屬性字串

+ (void)reslovedictionary:(nsdictionary * )dicelse

if ([obj iskindofclass:nsclassfromstring(@"__nscfarray")])else

if ([obj iskindofclass:nsclassfromstring(@"__nscfnumber")])else

if ([obj iskindofclass:nsclassfromstring(@"__nsdictionary")])

//屬性字串

nsstring * str;

if ([type

containsstring:@"ns"]) else

//每生成屬性字串,自動換行

}];//列印拼接好的字串

nslog(@"%@",strsum);

}@end

(5)字典轉模型的方式之一:kvc

#import "ly_dictomode.h"

@implementation

ly_dictomode

+ (instancetype)ly_dictomodefromekvc:(nsdictionary *)dic

@end

注意:這種方式必須保證,模型中的屬性和字典中的key一一對應!

如果不對應的話,只能重寫物件的setvalue:forundefinedkey:,把系統的方法覆蓋,

就能繼續使用kvc,字典轉模型了。

(6)隆重推出第二個字典轉模型的方式-runtime

思路:利用執行時,遍歷模型中所有屬性,根據模型的屬性名,去字典中查詢key,取出對應的值,給模型的屬性賦值。

步驟:提供乙個nsobject分類,專門字典轉模型,以後所有模型都可以通過這個分類轉。

+ (instancetype)modelwithdic:(nsdictionary *)dic;

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

ivar *ivarlist = a;

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

ivarlist[0];

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

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

//遍歷屬性陣列

for (int i = 0; i//去除成員屬性

ivar ivar = ivarlist[i];

//獲取成員屬性名

nsstring * name = [nsstring stringwithutf8string:ivar_getname(ivar)];

// 處理成員屬性名->字典中的key

// 從第乙個角標開始擷取

nsstring * key = [name substringfromindex:1];

// 根據成員屬性名去字典中查詢對應的value

id value = dic[key];

// 二級轉換:如果字典中還有字典,也需要把對應的字典轉換成模型

// 判斷下value是否是字典

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

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

// 判斷值是否是陣列

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

// 把模型陣列賦值給value

value = arrm;}}

if (value)

}return objc;

}@end

IOSruntime 執行時機制

首先必須明白的 1.是什麼 1 runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api 2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc的幕後工作者 下面這就是乙個例項,在前面的文章中講到過了 通過編譯成c語...

iOS Runtime執行時機制的正確使用姿勢

runtime執行時機制在專案中的實際使用 相信很多人都有過這樣的經歷,就是當我們接手乙個專案時,若要修復某個bug或是檢視某某功能是如何實現的,特別是大專案,再加上對專案的業務邏輯不熟悉 對專案的設計架構不熟悉的情況下,我們往往感到無從下手,或是需要花一定的時間才能找出對應的類。這篇部落格就是為了...

runtime 執行時機制

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