在Objective-C中,使用instancetype作为复制的返回类型?

9
使用instancetype作为init和相关方法的返回值是推荐的做法,详见最新的clang特性。然而,关于NSCopying协议中的copyWithZone:方法的返回值的最佳实践是什么呢(参见之前的最佳实践这个帖子)?在clang文章的方法命名规则推断类时并没有提到这一点,但我认为它不应该与alloc方法的返回值不同。
类型推断对于copy方法不起作用吗?我们应该仍然返回instancetype还是实际上返回的具体类类型?
2个回答

16

不要使用instancetype。显而易见的情况是有不可变/可变的区别——对于NSMutableStringcopy返回一个NSString,你应该将其视为不可变的。在这种情况下,API不会返回与接收器相同类型的实例。

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

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


4
你不需要声明copyWithZone:方法;这个方法已经被协议声明过了,如果你的类声称遵循该协议,那么它也采用了现有的声明。该声明使用id作为返回类型。
当然,在实现该方法时,你必须写下一个返回类型,但编译器在进行类型检查时使用的是声明而不是定义。
据我所知,instancetypeid*相兼容,因此你可以在定义中写出它们,但严格来说最好使用与声明完全相同的类型。
因此,请使用id
* 即,Clang不会抱怨将instancetype作为其返回类型定义的copyWithZone:方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接