多態:相同的名稱,不同的類 使不同的類共用相同方法名稱的能力成為多態。它讓你可以開發一組類,這組類中的每一個類都能響應相同的方法名。每個類的定義都封裝了響應特定方法所需要的代碼,這使得它獨立於其他的類定義。這是因為Objective-C的運行時系統在執行方法時知道消息的接收者是哪個類的對象,它總是攜 ...
多態:相同的名稱,不同的類
使不同的類共用相同方法名稱的能力成為多態。它讓你可以開發一組類,這組類中的每一個類都能響應相同的方法名。每個類的定義都封裝了響應特定方法所需要的代碼,這使得它獨立於其他的類定義。這是因為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類型做一些約束,這樣編譯器就能提前知道方法調用是否正確。