9

推荐使用instancetype作为返回值init和相关方法的方法,请参阅最新的clang features。但是,协议中返回值的最佳实践是什么copyWithZone:(有关以前的最佳实践,NSCopying请参阅此线程)?在clang文章中从方法的命名方案推断类的规则中没有提到,但我不明白为什么它应该与alloc方法的返回值不同。

类型推断是否不适用于copy-methods?我们应该返回还是返回instancetype我们实际返回的特定类类型?

4

2 回答 2

16

你不应该使用instancetype. 这里最明显的情况是存在不可变/可变的区别—— acopy的ANSMutableString返回 anNSString您应该将其视为不可变的。在这种情况下,API 不会返回与接收方相同类型的实例。

另一个原因是您应该匹配声明的签名,正如 Josh Caswell 指出的 (+1)。

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

于 2013-10-10T21:14:49.363 回答
4

你没有声明copyWithZone:;它已经被协议声明了,如果你的类说它符合协议,那么它也采用现有的声明。该声明id用作其返回类型。

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

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

因此,使用id.


*即,Clang 不会抱怨copyWithZone:被定义instancetype为它的返回类型。

于 2013-10-10T20:05:45.550 回答