2013-10-10 25 views
9

使用instancetype作为返回值init以及相关方法是推荐的方式,请参阅最新的clang features。但是,最佳做法是什么? NSCopying协议中的返回值copyWithZone:(有关以前的最佳做法,请参阅this thread)?在规则中没有提到从clang文章中的方法的命名方案推断类,但我不明白为什么它应该与alloc方法的返回值不同。使用instancetype作为Objective-C中副本的返回类型?

类型推断不适用于copy-方法吗?我们是否应该返回instancetype或者确切的返回类型类型?

回答

15

您不应该使用instancetype。这里最明显的例子就是存在不可变/可变的区别 - NSMutableString的返回NSString,您应该将其视为不可变的。在这种情况下,API不会返回与接收者相同类型的实例。

另一个原因是你应该匹配声明的签名,就像Josh Caswell指出的那样(+1)。

当然,没有什么能阻止你用你想要的语义和签名来声明自己的协议。

4

您并未声明copyWithZone:;它已经被协议声明,如果你的班级说它符合协议,那么它也采用现有的声明。该声明使用id作为其返回类型。

当您实现该方法时,您必须记下返回类型,当然,编译器在进行类型检查时使用声明而不是定义。

据我所知,instancetypeid *是“兼容的”,所以你可以在你的定义中写出,但严格来说,我认为最好使用与声明完全相同的类型。因此,使用id


*即,锵不抱怨copyWithZone:正在与instancetype作为它的返回类型定义。

相关问题