您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Objective-C多的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Objective-C多的示例分析”這篇文章吧。
一、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 =@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類型和靜態類型
– 如果不涉及到多態,盡量使用靜態類型
– 靜態類型可更好的在編譯階段而不是運行階段指 出錯誤
– 靜態類型能夠提高程序的可讀性
三、動態綁定
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多的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。