2013-10-10 57 views
9

使用instancetype作爲返回值init以及相關方法是推薦的方式,請參閱最新的clang features。但是,最佳做法是什麼? NSCopying協議中的返回值copyWithZone:(有關以前的最佳做法,請參閱this thread)?在規則中沒有提到從clang文章中的方法的命名方案推斷類,但我不明白爲什麼它應該與alloc方法的返回值不同。使用instancetype作爲Objective-C中副本的返回類型?

類型推斷不適用於copy-方法嗎?我們是否應該返回instancetype或者確切的返回類型類型?

回答

15

您不應該使用instancetype。這裏最明顯的例子就是存在不可變/可變的區別 - NSMutableString的返回NSString,您應該將其視爲不可變的。在這種情況下,API不會返回與接收者相同類型的實例。

另一個原因是你應該匹配聲明的簽名,就像Josh Caswell指出的那樣(+1)。

當然,沒有什麼能阻止你用你想要的語義和簽名來聲明自己的協議。

4

您並未聲明copyWithZone:;它已經被協議聲明,如果你的班級說它符合協議,那麼它也採用現有的聲明。該聲明使用id作爲其返回類型。

當您實現該方法時,您必須記下返回類型,當然,編譯器在進行類型檢查時使用聲明而不是定義。

據我所知,instancetypeid *是「兼容的」,所以你可以在你的定義中寫出,但嚴格來說,我認爲最好使用與聲明完全相同的類型。因此,使用id


*即,鏘不抱怨copyWithZone:正在與instancetype作爲它的返回類型定義。

相關問題