Runtime 五 協議與分類

2021-07-12 05:42:57 字數 3926 閱讀 7250

objectvie-c中的分類允許我們通過乙個類新增方法來擴充它(但是通過category不能新增新的例項變數),並且我們不需要訪問類中的**就可以做到。

objectvie-c中的協議是普遍存在的介面定義方式,即在乙個類中通過@protocol定義介面,在另外類中實現介面,這種介面定義方式也成為」delegation」模式,@protocol宣告了可以被其它任何方法類實現的方法,協議僅僅是定義乙個介面,而由其他的類去負責實現。

在本章中,我們來看看runtime對分類與協議的支援。

基礎資料型別

category

category是表示乙個指向分類的結構體的指標,其定義如下:

typedef

struct objc_category *category;

struct objc_category

這個結構體主要包含了分類定義的例項方法與類方法,其中instance_methods列表是objc_class中方法列表的乙個子集,而class_methods列表是元類方法列表的乙個子集。

protocol

protocol的定義如下:

typedef

struct objc_object protocol;

我們可以看到,protocol其中就是乙個物件結構體。

操作函式

runtime並沒有在

@inte***ce

runtimecategoryclass : nsobject

-(void)method1;

@end

@inte***ce

runtimecategoryclass (category)

-(void)method2;

@end

@implementation

runtimecategoryclass

-(void)method1

@end

@implementation

runtimecategoryclass (category)

-(void)method2

@end

#pragma mark-

-(void)test

}}

輸出結果

2014-11-08

10:36:39.213 [561:151847] 測試objc_class中的方法列表是否包含分類中的方法

2014-11-08

10:36:39.215 [561:151847] runtimecategoryclass's method: method2

2014-11-08 10:36:39.215 [561:151847] runtimecategoryclass's method: method1

2014-11-08

10:36:39.215 [561:151847] 分類方法method2在objc_class的方法列表中

而對於protocol,runtime提供了一系列函式來對其進行操作,這些函式包括:

//返回指定的協議

protocol *objc_getprotocol(const

char *name);

//獲取執行時所知道的所有協議的陣列

protocol **objc_copyprotocollist(unsigned

int *outcount);

//建立新的協議例項

protocol *objc_allocateprotocol(const

char *name);

//在執行時中註冊新建立的協議

void objc_registerprotocol(protocol *proto);

//為協議新增方法

void protocol_addmethoddescription(protocol *proto, sel name, const

char *types, bool isrequiredmethod, bool isinstancemethod);

//新增乙個已註冊的協議到協議中

void protocol_addprotocol(protocol *proto, protocol *addition);

//為協議新增屬性

void protocol_addproperty(protocol *proto, const

char *name, const objc_property_attribute_t *attributes, unsigned

int attributecount, bool isrequiredproperty, bool isinstanceproperty);

//返回協議名

const

char * protocol_getname(protocol *p);

//測試兩個協議是否相等

bool protocol_isequal(protocol *proto, protocol *other);

//獲取協議中指定條件的方法的方法描述陣列

struct objc_method_description * protocol_copymethoddescriptionlist(protocol *p, bool isrequiredmethod, bool isinstancemethod, unsigned

int *outcount);

//獲取協議中指定方法的方法描述

struct objc_method_description protocol_getmethoddescription(protocol *p, sel asel, bool isrequiredmethod, bool isinstancemethod);

//獲取協議中的屬性列表

objc_property_t * protocol_copypropertylist(protocol *proto, unsigned

int *outcount);

//獲取協議的指定屬性

objc_property_t protocol_getproperty(protocol *proto, const

char *name, bool isrequiredproperty, bool isinstanceproperty);

//獲取協議採用的協議

protocol ** protocol_copyprotocollist(protocol *proto, unsigned

int *outcount);

//檢視協議是否採用了另乙個協議

bool protocol_conformstoprotocol(protocol *proto, protocol *other);

objc_getprotocol函式,需要注意的是如果僅僅是宣告了乙個協議,而未在任何類中實現這個協議,則該函式返回的是nil。

objc_copyprotocollist函式,獲取到的陣列需要使用free來釋放。

objc_allocateprotocol函式,如果同名的協議已經存在,則返回nil。

objc_registerprotocol函式,建立乙個新的協議後,必須呼叫函式以在執行時中註冊新的協議。協議註冊後便可以使用,單不能再做修改,即註冊完後不能再向協議新增方法或協議。

需要強調的是,協議一旦註冊後就不可再修改,即無法再通過呼叫protocol_addmethoddescription,protocol_addprotocol和protocol_addproperty往協議中新增方法等。

小結

runtime並沒有提供過多的函式來處理分類。對於協議,我們可以動態的建立協議,並向其新增方法,屬性及繼承的協議,並在執行時動態的獲取這些資訊。

OC學習Runtime之協議與分類

堅持 成長 每日一篇 oc提供分類為已有的類進行擴充套件,提供協議來定義介面。分類 允許我們通過給乙個類新增方法來擴充它 但是通過category不能新增新的例項變數 並且我們不需要訪問類中的 就可以做到。分類在oc的定義為category category是表示乙個指向分類的結構體objc cat...

runtime 註冊類,協議

runtime 註冊協議 首先,通過方法 objc allocateprotocol 複製 建立新的協議,如果存在相同的協議的名稱則返回空。使用方法 protocol addmethoddescription 複製 為該協議新增方法 注 該方法必須在使用 objc registerprotocol ...

五 分類和協議

分類和協議 有時候在處理類定義的時候,可能想要為其新增一些新方法,但是由不想通過新建很多子類來繼承並且增加新方法,這個時候分類就有了用處。相當於在使用的時候只要註明是哪個分類。下面用例子來說明 import fraction.h inte ce fraction tests void printft...