我做了一些快速搜索,却找不到答案。
我很想知道为什么在Objective-C中,id
被用作init方法的返回类型。
我的猜测是因为如果重写了类,你不想返回超类类型的对象,但是我有兴趣知道是否由于其他原因而完成了。
答案 0 :(得分:19)
烨。你的想法是正确的钱。子类应该仍然能够使用其超类的初始化方法并返回其自己的类型而不是超类型,并且返回id
允许它执行此操作。
答案 1 :(得分:5)
超类型的想法,虽然是一个好的理论,但并没有真正站起来:NSString *
是 a NSObject *
。没有理由不能这样说。
相反,我认为它更多地与功能签名有关。在像Objective-C这样的动态语言中,你可能不知道你正在传递什么类。但编译器必须知道返回的是什么类型。这和Objective-C基于约定的编程历史(而不是严格的规则)意味着您的子类可以返回NSRect
(a struct
)或{{1}来自NSInteger
的(标量)。它很怪异,但有效。
C ++有类似的问题,请参阅Is the return type part of the function signature?。
所以我们需要一个签名为init
的所有方法的单一类型,而-(id)init
是唯一有意义的东西,因为它只指定了返回类型是一个实例。这足以让编译器做正确的事情。现在我们有id
,它与正在发送消息的类匹配。
答案 2 :(得分:3)
与此同时,Apple添加了一种新方法来声明init
方法的返回类型。
是instancetype
。详细了解它,例如here
答案 3 :(得分:2)
init可能实际返回不同类的实例,因此使用id
。不能说我曾经见过这种情况在实践中发生过,但是嘿:)