多態可以使不同類之間定義相同名字的方法。
動態類型是指在程序運行期間判斷對象類型。
動態綁定是指在運行期間判斷調用某對象的具體方法。
Dynamic Binding and the id Type
id類型的作用其實是能在運行期存儲任何類型的對象。
它的用法如下圖所示:
Compile Time Versus Runtime Checking
The id Data Type and Static Typing
id類型變量不能使用點操作符。
Argument and Return Types with Dynamic Typing
就是說方法的參數和返回值也可以是id類型的。
不同的類之間可以有同名的方法,但是一定要確保各方法參數的類型都是一致的,返回值的類型也是一致的。拿返回值來說,要么你都是對象類型,要么都是同一內置類型,不然編譯器就會發出警告,參數類型亦然。
對象類型之間可以不同,因為說到底它們之間傳遞的是指針,所以與具體的類型無關。
書中關于這一點說的比較少,我的理解也不一定全面。
Asking Questions about Classes
表9.1列舉了一些用于判斷動態類型的方法。
你可以用[類名 class]直接獲取一個無名對象實例。
你還可以通過[對象名 class]獲取該對象所屬的類型名。
判斷兩個對象類型是否相同,你可以用如下方式:
如果是使用動態類型的判斷方法的話可以如下使用:
這條語句的作用就是判斷myFract是不是Fraction類的對象。不知道怎么,我看著寫法就是有些別扭,這個myFract不是返回值,而是一個對象,isMemberOfClass是這個對象的方法,[Fraction class]是參數。
@selector指令
書中對該指令輕描淡寫,也沒有這一節,這是我對網上資料的理解。
它相當于取每個方法的編號,有點像函數指針的意思,它返回一個SEL類型的值,不同的方法返回的SEL值也不同。
其用法如下所示:
你可以這樣用:
你也可以這樣用:
這個判斷對該對象的各父類也是成立的,即,如果draw方法不在graphicObject中而在他的父類或者更高層的類中判斷的結果也是一樣的——該對象可以調用該方法(YES)。
這里面初步涉及到了托管(delegation)的概念。從書中的簡單描述來看,托管就是一個中間層,它連接了某一事件和處理該事件的若干各方法。
Exception Handling Using @try
這就是Objective-C中的異常處理,如下圖所示:
除此之外還有@finally和@throw,前者作為在異常處理中最后肯定被執行的語句塊而存在,后者可以指定你想拋出的異常。
同樣Objective-C也允許多個catch塊的出現。
和C++語言一樣,盡量不要用異常處理,能檢查出來的錯誤必須要檢查出來,實在沒辦法再用異常來結束程序。