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...