Objective-C多態:動態類型識別+動態綁定+動態加載

1、Objective-C多態objective-c

1.概念:相同接口,不一樣的實現數據結構

來自不一樣類能夠定義共享相同名稱的方法。函數

動態類型能使程序直到執行時才肯定對象所屬類型設計

動態類型綁定能使程序直到執行時才肯定要對對象調用的實際方法指針

2.Objective-C不一樣於傳統程序設計語言,它能夠再運行時加入新的數據類型和新的程序模塊:動態類型識別,動態綁定,動態加載對象

3.id類型:通用指針類型,弱類型,編譯時不進行類型檢查繼承

2、動態類型識別接口

1.任意NSObject的子類都會繼承NSObject的isa實例變量,並且當NSObject的子類實例化對象時,isa實例變量永遠是對象的第一個實例變量。內存

2.類對象ci

 *類對象再程序運行時一直存在。

      *類對象是一種數據結構,存儲類的基本信息:類大小,類名稱,類的版本以及消息與函數的映射表等

      *類對象所保存的信息在程序編譯時肯定,在程序啓動時加載到內存中。

      *類對象表明類,class表明類對象,類方法屬於類對象

      *若是消息的接收者是類名,則類名錶明類對象

      *運行時,全部類的實例都由類對象生成,類對象會把實例的isa的值修改爲本身的地址,每一個實例的isa都指向該實例的類對象,*從類對象裏能夠知道父類信息、能夠響應的方法等

      *類對象只能使用類方法,不能用實例方法

3.SEL類型

Objective-C在編譯的時候,會根據方法的名字 (包括參數序列),生成一個用來區分這個方法的惟一的一個標示(ID),這個標示(ID)就是SEL類型的,在運行時候是經過方法的標示來查找方法的。只要方法的名字(包括參數序列)相同,那麼它們的 ID都是相同的。能夠經過@select()指示符得到方法的標示。SEL mydraw =@select(draw);

NSSelectorFromString(NSString*);根據方法名獲得方法標識

(NSString*)NSStringFromSelector(SEL);獲得SEL類型的方法名

4.動態類型識別經常使用方法

-(BOOL)isKindOfClass:classObj  是不是classObj類或其子類

-(BOOL)isMemberOfClass:classObj是不是classObj的實例

-(BOOL)respondsTosSelector:selector  類中是否有這個方法

NSClassFromString(NSString*);由字符串獲得類對象

NSStringFromClass([類名 Class]);由類名獲得字符串

 

Class rectClass= [Rectangle class];經過類名獲得類對象

Class aClass =[anObject class];經過實例獲得類對象

if([obj1 class]== [obj2 class])判斷是否是相同類的實例

 

5. 能夠將對象分爲id類型和靜態類型

– 若是不涉及到多態,儘可能使用靜態類型

– 靜態類型可更好的在編譯階段而不是運行階段指 出錯誤

– 靜態類型可以提升程序的可讀性

3、動態綁定

1. 在objective-c中,一個對象內否調用指定的方法不是由編譯器決定而是由運行時決定,這被稱做是方法的動態綁定

     

2. 在objective-c裏,對象不調用方法,而是接收消息,消息 表達式爲: [reciver message];運行時系統首先肯定接收者的類型(動態類型識別),然 後根據消息名在類的方法列表裏選擇相依的方法執行,所 以在源代碼裏消息也稱爲選擇器(selector)

3. 消息函數的做用:

– 首先經過第一個參數的receiver,找到它的isa 指針,然 後在isa 指向的Class 對象中使用第二個參數selector 查 找方法;

– 若是沒有找到,就使用當前Class 對象中的新的isa 指針 到上一級的父類的Class 對象中查找;

– 當找到方法後,再依據receiver 的中的self 指針找到當前 的對象,調用當前對象的具體實現的方法(IMP),而後傳 遞參數,調用實現方法。

– 假如一直找到NSObject 的Class 對象,也沒有找到你調 用的方法,就會報告不能識別發送消息的錯誤。

 

4. Objetive-C中的Method結構

struct objc_method{

SEL method_name;//方法名

char *method_types; //方法地址

IMP method_imp; //方法地址(IMP)

};

typedefobjc_method Method;

5. 什麼是IMP

– IMP是」implementation」的縮寫,它是objetive-C 方法 (method)實現代碼塊的地址,相似函數指針,經過它能夠 直接訪問任意一個方法。免去發送消息的代價。

6. 獲取方法的IMP

– -(IMP)methodForSelector:(SEL)aSelector;

SEL print_sel =NSSelectorFromString(@「print:」);//得到SEL IMP imp=[person methodForSelector:print_sel];//獲得IMP imp(person,print_sel,@「*********」);//經過IMP直接調用方法 等效調用:[person print_sel:@「*********」];

– imp的第一參數是對象本身(self),第二參數是方法標示, 第三個是方法的參數

4、動態加載:運行時加載新類

在運行時建立一個新類,只須要3步:

一、爲 class pair分配存儲空間 ,使用 objc_allocateClassPair函數

二、增長鬚要的方法使用class_addMethod函數,增長實 例變量用class_addIvar

3 、用objc_registerClassPair函數註冊這個類,以便它能被別人使用。

注意:使用這些函數請引#import <objc/runtime.h>

 
相關文章
相關標籤/搜索