------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!
-------
多態這個其它語言也有。動態類型有類似的,但不完全相同。動態綁定別的語言也有類似,但沒有objective-c用的這麼多。
紅色部分你就能看出這三個概念最終針對的是什麼東西:
多態能夠使來自不同類的對象定義相同名稱的方法。
動態類型能使程序直到執行時才確定對象所屬的類。
動態綁定則能使程序直到執行時才確定實際要調用的對象方法。
多態:相同的名稱,不同的類
系統總是攜帶有關“一個對象屬於哪個類”這樣的信息。該信息能使系統在運行時做出這些關鍵性的決定,而不是在編譯時。
使不同的類共享相同方法名稱的能力稱爲多態。
動態綁定和id類型:
id dataValue;
變量dataValue被聲明爲id對象類型。因此,dataValue可用來保存程序中任何類型的對象。務必注意,聲明中並沒有使用星號。
id數據類型和靜態類型:
不要養成濫用id這種通用數據類型的習慣。下面告訴你爲什麼要使用靜態類型:
1)將一個變量定義爲特定類的對象時,使用的是靜態類型。“靜態”指的是對存儲在變量中對象的類型進行顯示聲明。這樣存儲在這種形態中的對象的類是預定義的,也就是靜態的。使用靜態類型時,編譯儘可能確保變量的用法在程序中始終保持一致。編譯器能夠通過檢查來確定應用於對象的方法是由該類定義的還是由該類繼承的,否則它將顯示警告信息。
2)使用靜態類型的另一個原因是它能夠提高程序的可讀性。
動態類型的參數和返回類型:
如何使用動態類型來調用一個方法,需要注意如下規則:如果在多個類中實現名稱相同的方法,那麼每個方法都必須符合各個參數的類型和返回值類型。這樣編譯器才能爲消息表達式生成正確的代碼。編譯器會對它所遇到的每個類聲明執行一致性檢查。
當一個方法選取對象作爲它的參數,而另一個方法選取浮點數作爲參數時,或者一個方法以對象作爲返回值,而另一個以整型數作爲返回值。編譯器可能生成不正確的代碼來向方法傳遞參數或處理返回值。
處理動態類型的方法:
-(BOOL) isKindOf:class-object(判斷對象是否是class-object或其子類的成員) -(BOOL) isMenberOfClass:class-object(判斷對象是否是class-object的成員) -(BOOL) respondsToSelector:selector(判斷對象是否能夠響應selector所指定的方法) +(BOOL) instancesRespondToSelector:selector(判斷指定的類實例是否能響應selector所指定的方法) +(BOOL) isSubclassOfClass:class-object(判斷對象是否是指定類的子類) -(id) performSelector:selector(應用selector指定的方法) -(id) performSelector:selector withObject:object(應用selector指定的方法,傳遞參數object) -(id) performSelector:selector withObject:object1 withObject:object2(應用selector指定的方法,傳遞參數object1和object2
可以對一個方法名應用@selector指令。例如:@selector (alloc)爲名爲alloc的方法生成一個SEL類型的值,該方法是從NSObject類繼承的。
記住,測試包含繼承的方法,並不是只測試直接定義在類中的方法。
performSelector:方法和它的變體允許你向對象發送消息,這個消息可以是存儲在變量中的selector。
在iOS中,respondsToSelector:方法廣泛用於實現委託(delegation)的概念。爲了讓系統能夠檢查你確實實現了特定的方法,使用respondsToSelector:判斷是否可以將事件的處理委託給你的方法。如果你沒有實現這個方法,它會自己處理該事件,按定義的默認行爲來執行。
@try
@catch
@finally
@throw
這些和java的或者其它語言差不多。Apple反對非必要的使用異常(誰都反對。哈哈)。