IOS runtime簡單使用

2021-07-22 17:02:47 字數 3308 閱讀 6788

一、runtime簡介

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

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

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

事實證明:

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

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

二、runtime作用

1.傳送訊息

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

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

使用訊息機制前提,必須匯入 objc/message.h標頭檔案

訊息機制簡單使用

//建立person物件 

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

//呼叫物件方法

[p eat];

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

objc_msgsend(p, @selector(eat));

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

//第一種通過類名呼叫

[person eat];

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

[[person class] eat];

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

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

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

//訊息機制原理:物件根據方法編號sel去對映表查詢對應的方法實現

2.交換方法

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

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

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

#import "viewcontroller.h"

#import "uiimage+image.h"

#import

@implementation

viewcontroller

- (void)viewdidload

@end

#import "uiimage+image.h"

#import

@implementation

uiimage (image)

/*定義完畢新方法後,需要弄清楚什麼時候實現與系統的方法互動?

既然是給系統的方法新增額外的功能,換句話說,我們以後在開發中都是使用自己定義的方法,取代系統的方法,所以,當程式一啟動,就要求能使用自己定義的功能方法.說道這裡:我們必須要弄明白一下兩個方法 :

+(void)initialize(當類第一次被呼叫的時候就會呼叫該方法,整個程式執行中只會呼叫一次)

+ (void)load(當程式啟動的時候就會呼叫該方法,換句話說,只要程式一啟動就會呼叫load方法,整個程式執行中只會呼叫一次)*/

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

+ (void)load

列印結果:2016-09-13

17:46:59.703 runtime[5243:2515939] 載入的名為:123

3.動態新增方法

#import "viewcontroller.h"

#import "person.h"

#import

@inte***ce

viewcontroller ()

@end

@implementation

viewcontroller

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

/*經典面試題:有沒有使用performselector,其實主要想問你有沒有動態新增過方法。

簡單使用*/

- (void)viewdidload

@end

#import "person.h"

#import

@implementation

person

預設方法都有兩個隱式引數

/*1, self:方法呼叫者

_cmd:當前呼叫方法編號

方法的隱式引數即: 沒有暴露出來引數.*/

void study(id

self, sel _cmd)

//當乙個物件呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.

//剛好可以用來判斷,未實現的方法是不是我們想要動態新增的方法

+ (bool)resolveinstancemethod:(sel)sel

// 先恢復, 不然會覆蓋系統的方法

return [super resolveinstancemethod:sel];

}// 引數解釋:

// class;給哪個類新增方法

// sel:新增方法

// imp:方法實現,函式名

// types:方法型別(不要去死記,官方文件中有)

//class_addmethod(__unsafe_unretained class cls, sel name, imp imp, const char *types)

@end

4.給分類新增屬

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

#import "viewcontroller.h"

#import "nsobject+property.h"

#import

@inte***ce

viewcontroller ()

@end

@implementation

viewcontroller

- (void)viewdidload

@end

#import "nsobject+property.h"

#import

//定義關聯的key

static

const

char *key = "name";

@implementation

nsobject (property)

- (nsstring *)name

- (void)setname:(nsstring *)name

@end

iOS runtime,訊息傳送

objective c runtime ios執行時 runtime 詳解 demo ios 訊息傳送與 詳解 ios runtime 的使用場景 實戰篇 method swizzling oc 實現 ios runtime實戰應用 method swizzling method swizzling...

iOS Runtime基礎結構

runtime概念 oc是基於c的,區別於c的一點就是oc屬於動態語言,並且有物件導向的特性。相比於c,函式的呼叫在編譯的時候會決定呼叫哪個函式。oc會在編譯和鏈結時做的事情放到了執行時 runtime 來處理,其呼叫函式的方法為msg send,屬於動態呼叫,只有在真正執行才會根據函式名稱找到對應...

iOS Runtime字型適配

你還在為適配字型大小發愁?看這裡 define myuiscreen 375 ui設計原型圖的手機尺寸寬度 6 6p的 414 implementation uifont runtime void load uifont adapterfontofsize cgfloat fontsize 正常呼叫...