这里的基本Cocoa新手问题......这似乎是Cocoa中非常常见的模式。为什么像[NSArray arrayWithObjects: ...]
这样的init方法和自动释放的对象创建方法会返回id
?为什么返回NSArray *
(或创建的实际类型)并不是更好?
答案 0 :(得分:1)
init
方法返回id
,因此它们可以返回与其超类相同的类。
Objective-C集合类返回id
,因为它们可以存储任何类型的Objective-C对象。
答案 1 :(得分:1)
另一个原因是返回值的类型选择器匹配。如果[NSArray arrayWithObjects: ...]
返回NSArray
(通过声明),则NSMutableArray
需要使用不同的返回类型重新声明arrayWithObjects:
(否则在撰写时会收到警告{ {1}})。
即使你走了那条路,当编译器试图将选择器与类型/非类型匹配时,消息链接很快就会导致歧义。所以...在这种情况下,选择器的返回和参数类型应该匹配。因此,使用了返回类型NSMutableArray * a = [NSMutableArray arrayWithArray:]
。
如果您尝试使用此类构造函数构建严格类型的objc层次结构并使用高警告级别,您将看到这种模糊性如何展开。当然,NSArray / NSMutableArray示例足以描述问题。
答案 2 :(得分:0)
实际上它会返回NSArray / NSMutalbeArray /无论如何。
id只是init的泛型返回值。因此返回值被声明为id,但它是一个正在返回的NSArray。
但坦率地说,我不能对你的“为什么”问题给你任何好的答案。当我覆盖子类中的init方法时,如果类的名称是ABC,则让它们返回ABC *。它只是工作正常。