我們經(jīng)常忽略 Cocoa 充滿了約定,并且這些約定可以幫助編譯器變得更加聰明。無論編譯器是否遭遇 alloc 或者 init 方法,他會知道,即使返回類型都是 id ,這些方法總是返回接受到的類類型的實(shí)例。因此,它允許編譯器進(jìn)行類型檢查。(比如,檢查方法返回的類型是否合法)。Clang的這個(gè)好處來自于 related result type, 意味著:
messages sent to one of alloc and init methods will have the same static type as the instance of the receiver class (發(fā)送到 alloc 或者 init 方法的消息會有同樣的靜態(tài)類型檢查是否為接受類的實(shí)例。)
更多的關(guān)于這個(gè)自動定義相關(guān)返回類型的約定請查看 Clang Language Extensions guide 的appropriate section
一個(gè)相關(guān)的返回類型可以明確地規(guī)定用 instancetype 關(guān)鍵字作為返回類型,并且它可以在一些工廠方法或者構(gòu)造器方法的場景下很有用。它可以提示編譯器正確地檢查類型,并且更加重要的是,這同時(shí)適用于它的子類。
@interface ZOCPerson
+ (instancetype)personWithName:(NSString *)name;
@end
雖然如此,根據(jù) clang 的定義,id 可以被編譯器提升到 instancetype 。在 alloc 或者 init 中,我們強(qiáng)烈建議對所有返回類的實(shí)例的類方法和實(shí)例方法使用 instancetype 類型。
在你的 API 中要構(gòu)成習(xí)慣以及保持始終如一的,此外,通過對你代碼的小調(diào)整你可以提高可讀性:在簡單的瀏覽的時(shí)候你可以區(qū)分哪些方法是返回你類的實(shí)例的。你以后會感謝這些注意過的小細(xì)節(jié)的。