3

通常,作爲一個很好的可可公民,我編寫了我的初始化程序,返回類型爲id(即指向通用對象的指針),以便稍後進行更簡單的子類化(儘管99%的時間我不需要這樣做) 。Objective-C類集羣和私有類初始化程序

現在我正在創建自己的類集羣(大量的私有類僅限於單個公共類)。問題:我是否還需要定義私有類初始化爲返回通用id指針:

- (id)initSubclassForFooClassCluster; 

或指向私有類本身喜歡:

- (SubclassForFooClassCluster *)initSubclassForFooClassCluster; 
+0

你可以參考http://stackoverflow.com/questions/4702904/what-is-preferable-in-objective-c-id-or-explicit-type – Maulik

回答

1

你可以只用(ID)在你的init方法中,聲明一個更具體的類型對你來說不會有太大的幫助。如果你真的想讓你的私有子類保密,你應該使用id,否則當你的類的內部信息應該沒有必要的時候,根據你需要泄露你的類的內部信息。

NSString是一個類集羣,它的所有init方法都返回id,因爲根據傳遞給init方法的內容,同一個方法可能會返回不同的對象類型。

+0

如何在不使用'id時泄漏內部信息'? 'NSLog'語句將顯示公共類初始化程序返回的私有類的名稱。 – Eimantas

+2

沒錯,但這隻能在運行時發現。如果您的方法簽名在其中包含(大概是私有的)子類類型,那麼您的API的客戶端可能會直接引用這些類型,這會否定具有不透明超類的好處,其目的是隱藏類層次結構的實現細節。 – Kevlar