武汉ios培训instancetype和id类型小记.doc_第1页
武汉ios培训instancetype和id类型小记.doc_第2页
武汉ios培训instancetype和id类型小记.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉ios培训instancetype和id类型小记在iOS开发里面曾几何时对象实例化不返回id了,而是返回instancetype了,clang编译器是基于LLVM 5.0只要一个类返回自身的实例,用instancetype就有好处interfaceFoo:NSObject-(id)initWithBar:(NSInteger)bar; / initializer+(id)fooWithBar:(NSInteger)bar; / convenience constructorend对于简易构造函数(convenience constructor),应该总是用instancetype。编译器不会自动将id转化为instancetype。id是通用对象,但如果你用instancetype,编译器就知道方法返回什么类型的对象。这个问题可不只有学术意义,比如,NSFileHandlefileHandleWithStandardOutput writeData:formattedData在Mac OS X(只在该OS版本)中会报错“Multiple methods named writeData: found with mismatched result, parameter type or attributes.”原因是NSFileHandle和NSURLHandle都提供writeData:方法。由于NSFileHandlefileHandleWithStandardOutput 返回的类型是id,编译器并不确定请求了哪个类的writeData:方法。你可以用(NSFileHandle*)NSFileHandlefileHandleWithStandardOutputwriteData:formattedData;或NSFileHandle*fileHandle=NSFileHandlefileHandleWithStandardOutput;fileHandlewriteData:formattedData;来绕过。当然,更好的方法是声明fileHandleWithStandardOutput的返回类型为instancetype。(注意:这段样例代码在iOS中并不会报错,因为iOS中只有NSFileHandle提供writeData:方法。但length等方法则会,UILayoutSupport会返回CGFloat,而NSString则会返回NSUInteger)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;代码更加一致,可读性更强。它们返回相同的东西,这一点一目了然。结论除非你有意为旧编译器写代码,不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论