instancetype和id用作返回类型
来源:互联网 发布:做商城需要数据库吗 编辑:程序博客网 时间:2024/04/29 06:58
@interface Foo:NSObject - (id)initWithBar:(NSInteger)bar; // initializer +(id)fooWithBar:(NSInteger)bar; // convenience constructor @end
对于简易构造函数(convenience constructor),应该总是用instancetype。编译器不会自动将id转化为instancetype。id是通用对象,但如果你用instancetype,编译器就知道方法返回什么类型的对象。
这个问题可不只有学术意义,比如,[[NSFileHandle fileHandleWithStandardOu
你可以用
[(NSFileHandle *)[NSFileHandle fileHandleWithStandardOutput ]writeData:formattedData];
或
NSFileHandle *fileHandle = [NSFileHandle fileHandleWithStandardOutput ];[fileHandle writeData:formattedData];
来绕过。
当然,更好的方法是声明fileHandleWithStandardOu
initializer的情况更复杂,当你输入
- (id)initWithBar:(NSInteger)bar
编译器会假设你输入了
- (instancetype)initWithBar:(NSInteger)bar
对于ARC而言,这是必须的。Clang Language Extensions的相关结果类型(Related result types)也讲到了这一点。也许别人会据此告诉你不必使用instancetype,但我建议你用它。下面解释我为什么如此建议。
使用instancetype有三点好处:
1、明确性。代码只做你让它做的事,而不是其他。
2、程式化。你会养成好习惯,这些习惯在某些时候会很有用,而且肯定有用武之地。
3、一致性。让代码可读性更好。
明确性
用instancetype代替init作为返回值的确没有技术上的好处。但这是因为编译器自动将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;
代码更加一致,可读性更强。它们返回相同的东西,这一点一目了然。
个人结论:就是说使用instancetype 返回的一定是调用该方法的实例,而id则不一定,因为id是作为一个范型来使用的。
在写一条返回id的消息前,问自己:这个类返回实例吗?如果返回,用instancetype。
肯定有需要返回id的时候,但你用instancetype的频率应该会更高。
- instancetype和id用作返回类型
- id类型 和 instancetype类型
- instancetype和id类型区别
- instancetype类型和id类型的异同
- OC-ID类型和instanceType区别
- iOS instancetype和id类型区别
- 用instancetype代替id作返回类型有什么好处?
- 用instancetype代替id作返回类型有什么好处?
- 用instancetype代替id作返回类型有什么好处
- 用instancetype代替id作返回类型有什么好处
- instancetype和id类型的区别和用处
- id 和 instancetype
- instancetype和id区别
- iOS id和instancetype
- instancetype和id异同
- id和instancetype区别
- instancetype和id关键字
- id和instancetype区别
- Back键和Home键的屏蔽
- EXISTS --in
- iOS使用CAShapeLayer实现复杂的View遮罩效果
- Python使用taskkill 报错 系统找不到指定的路径
- Android开发 第三方库
- instancetype和id用作返回类型
- csapp 第八章第2题的疑惑
- 如何从layout文件添加 fragment
- 常用的正则表达式规则和基本规范
- Android手机 Fildder真机抓包
- 四.有关关机和查看系统信息的命令
- Cannot add header view to list -- setAdapter has already been called.
- Swift--map函数浅析
- 融信(仿微信)项目朋友圈相关接口需求