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