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

來源:互聯網
上載者:User

標籤:

一、Objective-C多態

1.概念:相同介面,不同的實現

來自不同類可以定義共用相同名稱的方法。

動態類型能使程式直到執行時才確定對象所屬類型

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

2.Objective-C不同於傳統程式設計語言,它可以再運行時加入新的資料類型和新的程式模組:動態類型識別,動態綁定,動態載入

3.id類型:通用指標類型,弱類型,編譯時間不進行類型檢查

二、動態類型識別

1.任意NSObject的子類都會繼承NSObject的isa執行個體變數,而且當NSObject的子類執行個體化對象時,isa執行個體變數永遠是對象的第一個執行個體變數。

2.類對象

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

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

      *類對象所儲存的資訊在程式編譯時間確定,在程式啟動時載入到記憶體中。

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

      *如果訊息的接收者是類名,則類名代表類對象

      *運行時,所有類的執行個體都由類對象產生,類對象會把執行個體的isa的值修改成自己的地址,每個執行個體的isa都指向該執行個體的類對象,*從類對象裡可以知道父類資訊、可以響應的方法等

      *類對象只能使用類方法,不能用執行個體方法

3.SEL類型

Objective-C在編譯的時候,會根據方法的名字 (包括參數序列),產生一個用來區分這個方法的唯一的一個標示(ID),這個標示(ID)就是SEL類型的,在運行時候是通過方法的標示來尋找方法的。只要方法的名字(包括參數序列)相同,那麼它們的 ID都是相同的。可以通過@select()指示符獲得方法的標示。SEL mydraw [email protected](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類型和靜態類型

– 如果不涉及到多態,盡量使用靜態類型

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

– 靜態類型能夠提高程式的可讀性

三、動態綁定

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),第二參數是方法標示, 第三個是方法的參數

四、動態載入:運行時載入新類

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

1、為 class pair分配儲存空間 ,使用 objc_allocateClassPair函數

2、增加需要的方法使用class_addMethod函數,增加實 例變數用class_addIvar

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

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.