Objective-C多的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Objective-C多的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Objective-C多的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比定海網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式定海網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋定海地區(qū)。費用合理售后完善,10年實體公司更值得信賴。

一、Objective-C多態(tài)

1.概念:相同接口,不同的實現(xiàn)

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

動態(tài)類型能使程序直到執(zhí)行時才確定對象所屬類型

動態(tài)類型綁定能使程序直到執(zhí)行時才確定要對對象調(diào)用的實際方法

2.Objective-C不同于傳統(tǒng)程序設計語言,它可以再運行時加入新的數(shù)據(jù)類型和新的程序模塊:動態(tài)類型識別,動態(tài)綁定,動態(tài)加載

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

二、動態(tài)類型識別

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

2.類對象

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

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

   *類對象所保存的信息在程序編譯時確定,在程序啟動時加載到內(nèi)存中。

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

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

   *運行時,所有類的實例都由類對象生成,類對象會把實例的isa的值修改成自己的地址,每個實例的isa都指向該實例的類對象,*從類對象里可以知道父類信息、可以響應的方法等

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

3.SEL類型

Objective-C在編譯的時候,會根據(jù)方法的名字 (包括參數(shù)序列),生成一個用來區(qū)分這個方法的唯一的一個標示(ID),這個標示(ID)就是SEL類型的,在運行時候是通過方法的標示來查找方法的。只要方法的名字(包括參數(shù)序列)相同,那么它們的 ID都是相同的。可以通過@select()指示符獲得方法的標示。SEL mydraw =@select(draw);

NSSelectorFromString(NSString*);根據(jù)方法名得到方法標識

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

4.動態(tài)類型識別常用方法

-(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類型和靜態(tài)類型

– 如果不涉及到多態(tài),盡量使用靜態(tài)類型

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

– 靜態(tài)類型能夠提高程序的可讀性

三、動態(tài)綁定

1. 在objective-c中,一個對象內(nèi)否調(diào)用指定的方法不是由編譯器決定而是由運行時決定,這被稱作是方法的動態(tài)綁定。

2. 在objective-c里,對象不調(diào)用方法,而是接收消息,消息 表達式為: [reciver message];運行時系統(tǒng)首先確定接收者的類型(動態(tài)類型識別),然 后根據(jù)消息名在類的方法列表里選擇相依的方法執(zhí)行,所 以在源代碼里消息也稱為選擇器(selector)

3. 消息函數(shù)的作用:

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

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

– 當找到方法后,再依據(jù)receiver 的中的self 指針找到當前 的對象,調(diào)用當前對象的具體實現(xiàn)的方法(IMP),然后傳 遞參數(shù),調(diào)用實現(xiàn)方法。

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

4. Objetive-C中的Method結(jié)構

struct objc_method{

SEL method_name;//方法名

char *method_types; //方法地址

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

};

typedefobjc_method Method;

5. 什么是IMP

– IMP是”implementation”的縮寫,它是objetive-C 方法 (method)實現(xiàn)代碼塊的地址,類似函數(shù)指針,通過它可以 直接訪問任意一個方法。免去發(fā)送消息的代價。

6. 獲取方法的IMP

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

SEL print_sel =NSSelectorFromString(@“print:”);//獲得SEL IMP imp=[person methodForSelector:print_sel];//得到IMP imp(person,print_sel,@“*********”);//通過IMP直接調(diào)用方法 等效調(diào)用:[person print_sel:@“*********”];

– imp的第一參數(shù)是對象自己(self),第二參數(shù)是方法標示, 第三個是方法的參數(shù)

四、動態(tài)加載:運行時加載新類

在運行時創(chuàng)建一個新類,只需要3步:

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

2、增加需要的方法使用class_addMethod函數(shù),增加實 例變量用class_addIvar

3 、用objc_registerClassPair函數(shù)注冊這個類,以便它能被別人使用。

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

以上是“Objective-C多的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享標題:Objective-C多的示例分析-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article48/cospep.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、移動網(wǎng)站建設、電子商務、做網(wǎng)站、自適應網(wǎng)站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設