OC-019.instancetype和id的异同点

来源:互联网 发布:最后一班知乎 编辑:程序博客网 时间:2024/06/05 05:58

说实在这2个类型,对于现在的我来说还是有点模糊不清,通过查了许多资料,我也简单的总结一下。

对于初学者我觉得只要知道注意点,不需要深究。

instancetype和id的异同点

1、相同点:都可以作为方法的返回类型

2、不同点:1.instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

                    2.instancetype只能作为返回值,不能像id那样作为参数


想了解的话也可以去看这边的文章:http://blog.csdn.net/kuizhang1/article/details/18048829


使用instancetype有三点好处:(转自电脑达人崔良飞的回答)
1、明确性。代码只做你让它做的事,而不是其他。
2、程式化。你会养成好习惯,这些习惯在某些时候会很有用,而且肯定有用武之地。
3、一致性。让代码可读性更好。
明确性
用instancetype代替id作为返回值的确没有技术上的好处。但这是因为编译器自动将id转化成了instancetype。你以为init返回的值类型是id,其实编译器返回了instancetype。
这两行代码对于编译器来说是一样的:
- (id)initWithBar:(NSInteger)bar;
- (instancetype)initWithBar:(NSInteger)bar;

但在你眼里,这两行代码却不同。你不该学着忽视它。
模式化
在使用init等方法时的确没有区别,但在定义简易构造函数时就有区别了。
这两行代码并不等价:
+ (id)fooWithBar:(NSInteger)bar;
+ (instancetype)fooWithBar:(NSInteger)bar;

如果用instancetype作为函数的返回类型,就不会出错。
一致性:
最后,想象把所有东西放到一起时的情景:你想要一个init方法和一个简易构造函数。
如果你用id来作为init函数的返回类型,最终代码如下:
- (id)initWithBar:(NSInteger)bar;
+ (instancetype)fooWithBar:(NSInteger)bar;

但如果你用instancetype,代码如下:
- (instancetype)initWithBar:(NSInteger)bar;
+ (instancetype)fooWithBar:(NSInteger)bar;

代码更加一致,可读性更强。它们返回相同的东西,这一点一目了然。

0 0