iOS 對RunTime的一些簡單了解

2021-07-24 03:20:44 字數 2893 閱讀 6895

好多天沒有寫部落格,就把這些天總結的一些東西拿出來分享下

下面簡單的談一談runtime,小弟才疏學淺,有錯誤的地方希望指出來。。。

不多說了直接上**吧,好多筆記都寫成了注釋。。

/**

* runtime 簡稱為執行時。oc就是一種執行時機制,就是再執行的時候執行的一種機制,其中最主要的是訊息機制

* 相對來說c語言是在編譯的時候就知道要呼叫哪個函式,因為c語言如果只宣告函式不去實現,在編譯的時候就會報錯

* 但是對於oc的函式來說,編譯時候,你可以只宣告但是不去實現,但是在執行的時候就會報錯。因為在執行的時候會呼叫這個函式。

* * runtime的幾個作用:

* 1、訊息機制:oc中呼叫方法的本質實質就是讓物件傳送訊息objc_msgsend

* 2、交換方法(開發中常用的方法):讓兩個方法交換,即在呼叫兩個方法的時候互相執行對方的方法

* 3、動態的新增方法

* 4、給分類新增屬性

* 5、字典轉模型、封裝資料庫、自動解檔和歸檔

*//** 訊息機制*/

// 類方法本質:類物件呼叫[nsobject class]

// id:誰傳送訊息

// sel:傳送什麼訊息

// ((nsobject *(*)(id, sel))(void *)objc_msgsend)([nsobject class], @selector(alloc));

開發中使用場景:需要用到runtime,訊息機制

1.裝逼

2.不得不用runtime訊息機制,可以幫我呼叫私有方法.

// person *p = [person alloc];

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

// p = [p init];

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

// 呼叫eat

[p eat];

objc_msgsend(p, @selector(eat));

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

/** 使用訊息機制的一些問題*/

// xcode6之前,蘋果執行使用objc_msgsend.而且有引數提示

// xcode6蘋果不推薦我們使用runtime

// 解決訊息機制方法提示步驟

// 查詢build setting -> 搜尋msg

// 最終生成訊息機制,編譯器做的事情

// 最終**,需要把當前**重新編譯,用xcode編譯器,clang

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

/* runtime(交換方法):只要想修改系統的方法實現

需求:比如說有乙個專案,已經開發了2年,忽然專案負責人新增乙個功能,每次uiimage載入,告訴我是否載入成功

// 給系統的imagenamed新增功能,只能使用runtime(互動方法)

// 1.給系統的方法新增分類

// 2.自己實現乙個帶有擴充套件功能的方法

// 3.互動方法,只需要互動一次,

// 1.自定義uiimage

// 2.uiimage新增分類

弊端:1.每次使用,都需要匯入

2.專案大了,沒辦法實現

*/// 把類載入進記憶體的時候呼叫,只會呼叫一次

+ (void)load

// 1.載入

// 2.判斷是否載入成功

+ (uiimage *)xmg_imagenamed:(nsstring *)name

else

return image;}/*

開發中不太常用,但是面試的時候用

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

qq,微博,直播等等應用,都有會員機制

美團有個面試題?有沒有使用過performselector,什麼時候使用?動態新增方法的時候使用過?怎麼動態新增方法?用runtime?為什麼要動態新增方法?

*/ 什麼時候動態新增方法: 如果有些方法不經常用,可以先不去實現,使用動態新增方法的方法去呼叫

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

[p performselector:@selector(run:) withobject:@10];

//這時候要呼叫run的方法,那麼久要在.m檔案中實現一下方法

// 沒有返回值,也沒有引數

// void,(id,sel)

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

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

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

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

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}// 動態新增屬性:什麼時候需要動態新增屬性

// 開發場景

// 給系統的類新增屬性的時候,可以使用runtime動態新增屬性方法

// 本質:動態新增屬性,就是讓某個屬性與物件產生關聯

// 需求:讓乙個nsobject類 儲存乙個字串

// runtime一般都是針對系統的類

// 通過這兩個方法進行賦值

- (void)setname:(nsstring *)name

- (nsstring *)name

對iOS鎖的一些研究

objc view plain copy import import import import define iterations 1024 1024 32 void testlock now cfabsolutetimegetcurrent printf nslock f sec n now t...

對synchronized this 的一些理解

一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...

對synchronized this 的一些理解

一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...