iOS開發筆記系列-基礎3(多態、動態類型和動態綁定),ios多態
多態:相同的名稱,不同的類
使不同的類共用相同方法名稱的能力成為多態。它讓你可以開發一組類,這組類中的每一個類都能響應相同的方法名。每個類的定義都封裝了響應特定方法所需要的代碼,這使得它獨立於其他的類定義。這是因為Objective-C的運行時系統在執行方法時知道訊息的接收者是哪個類的對象,它總是攜帶有關“一個對象屬於哪個類”這樣的資訊,該資訊能使系統在運行時做出決定,而不是在編譯時間。
動態綁定和id類型
id資料類型是一種通用的物件類型,可以用來儲存屬於任何類的對象。當使用id類型的時候,程式的一些測試被從編譯時間延遲到了運行時進行,因為在編譯時間系統還無法確定這個資料類型究竟是什麼類型的。
如果使用動態類型來調用一個方法,需要注意一下規則:如果在多個類中實現名稱相同的方法,那麼每個方法都必須符合各個參數的類型和傳回值類型,這樣編譯器才能為訊息運算式產生正確的代碼。
Objective-C中的類都繼承自NSObject類,而這個類支援一些方法,可以用來避免錯誤或在程式運行時檢查程式的完整性,如下:
方法 |
問題或行為 |
-(BOOL) isKindOfClass: class-object |
對象是不是class-object或其子類的成員 |
-(BOOL) isMemberOfClass: class-object |
對象是不是class-object的成員 |
-(BOOL) respondsToSelector: Selector |
對象是否能夠響應selector所指定的方法 |
-(BOOL) instancesRespondToSelector: Selector |
指定的類執行個體能否響應selector |
-(BOOL) isSubclassOfClass: class-object |
對象是否是指定類的子類 |
-(BOOL) performSelector: Selector |
應用selector指定的方法 |
-(BOOL) performSelector: Selector withObject: object |
應用selector指定的方法,傳遞參數object |
-(BOOL) performSelector: Selector withObject: object1 withObject: object2 |
應用selector指定的方法,傳遞參數object1和object2 |
這樣在id類型對象上調用某方法之前,就可以先進行一些判斷,來阻止可能產生的錯誤和崩潰。
此外,也可以採用其他策略如使用 forwardInvocation: 方法將訊息轉寄給其他對象處理。
在實際開發中也可以通過協議來對id類型做一些約束,這樣編譯器就能提前知道方法調用是否正確。