在Objective-C中,为什么id被用作init方法的返回类型?

Ben*_*ron 29 objective-c

我做了一些快速搜索,无法找到答案.

我很想知道为什么在Objective-C中,它id被用作init方法的返回类型.

我的猜测是因为如果类被重写,你不想返回超类的类型的对象,但我有兴趣知道它是否由于其他原因而完成.

Sea*_*ean 19

对.你的想法是正确的钱.子类仍然应该能够使用其超类的初始化方法并返回其自己的类型而不是超类型,并且返回id允许它执行此操作.

  • 相关阅读:Clang引入了一个新的关键字`instancetype`,它可以进行类型检查,同时保留除`init`以外的方法的继承功能.请参阅[开始使用instancetype而不是id是否有益?](http://stackoverflow.com/q/8972221) (11认同)

Ste*_*her 5

超级类型的想法,虽然是一个好的理论,但并没有真正站起来:A NSString * 一个NSObject *.没有理由不能这样说.

相反,我认为它更多地与功能签名有关.在像Objective-C这样的动态语言中,你可能不知道你正在传递什么类.但是编译器必须知道返回的是什么类型.这和Objective-C基于约定的编程历史(而不是严格的规则)意味着你的子类可以返回NSRect(a struct)或NSInteger(标量)init.这是怪异的,但有效.

C++有类似的问题,请参阅函数签名的返回类型部分吗?.

所以我们需要一个具有签名的所有方法的单一类型-(id)init,并且id是唯一有意义的,因为它只指定了返回类型是一个实例.这足以让编译器做正确的事情.现在我们有instancetype,它与正在发送消息的类匹配.