Clang的文档里提到instancetype is a contextual keyword that is only permitted in the result type of an Objective-C method. 也就是说,instancetype只能作为返回值,不能像id那样作为参数。

原来这种技术基本从iOS 5的UINavigationController里就开始应用了。

当一个类返回相同类的实例的时候使用  instancetype 是合适。

首先:做如下定义

1 @interface Foo:NSObject
2 - (id)initWithBar:(NSInteger)bar; // initializer
3 + (id)fooWithBar:(NSInteger)bar;  // convenience constructor
4 @end

编译器不会自动将  id 转换为 instancetype 。

对于 init,他变得更加的复杂。比如当你写成如下格式

- (id)initWithBar:(NSInteger)bar

编译器会用如下形式保护起来:

- (instancetype)initWithBar:(NSInteger)bar

这对使用ARC编译是很有必要的,同样因为编译器会做如上保护,有些人会告诉你没有必要使用 instancetype.

但是使用instancetype 有以下有利点。

一。更加明确:

在技术层面上讲,使用 intancetype 代替 id 是没有什么有利点儿。但是不能因为 init 编译器会将 id 转换成 instancetype,你就以此为借口。确实下面两个方法是相同的。

1 - (id)initWithBar:(NSInteger)bar;
2 - (instancetype)initWithBar:(NSInteger)bar;

但是至少在你眼里看出来是不同的。

二。模式化(Pattern) (不知道怎么翻译)

虽然 id 和 instancetype 对于 init 是一样的,但是对于构造函数来说他们是不一样的。

以下是不等价的:

1 + (id)fooWithBar:(NSInteger)bar;
2 + (instancetype)fooWithBar:(NSInteger)bar;

使用第二种返回构造着时候,你每次都会得到正确的结果。

三。一致性

当你使用 init 和 构造函数 (convenience constructor)时候,两者混合在一起

1 - (id)initWithBar:(NSInteger)bar;
2 + (instancetype)fooWithBar:(NSInteger)bar;

当你一致时候:

1 - (instancetype)initWithBar:(NSInteger)bar;
2 + (instancetype)fooWithBar:(NSInteger)bar;

使用 instacetype ,能够让其他方法有诸如  +alloc +new -autorelease -init -retain  一样的特殊特性。

如下方法:

 1  #import "AppDelegate.h"2 3 4 @interface Foo : NSObject @end5 @implementation Foo6 + (id)buildInstance {7     return [[self alloc] init];8 }9 - (id)init {
10     return [super init];
11 }
12 @end
13
14 @interface Bar : Foo @end
15 @implementation Bar
16 - (void)doSometingElse { … }
17 @end
18
19 @implementation AppDelegate
20 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
21     [[Foo buildInstance] doSometingElse];
22     [[Bar buildInstance] doSometingElse];
23     [[[Foo alloc] init] doSometingElse];
24     [[[Bar alloc] init] doSometingElse];
25 }
26 @end

尽管下面两行

1 [[Foo buildInstance] doSometingElse];
2 [[[Foo alloc] init] doSometingElse];

对于编译器来说是一样的(buildInstance 和 init 都返回 id),我们仅仅在 init 方法得到一个错误。

转存失败重新上传取消

但是在

[[[Bar alloc] init] doSometingElse];

没有错误!

[[Foo alloc] init] 正确的返回了 Foo 类型,[[Bar alloc] init] 正确的返回了 Bar 类型,但是我们没有看到 [[Foo buildInstance] doSometingElse] or [[Bar buildInstance] doSometingElse].

如果使用 intancetype 代替 id,如:

1 + (instancetype)buildInstance {
2     return [[self alloc] init];
3 }

我们将会得到

转存失败重新上传取消

iOS:instancetype 对比 id 的好处相关推荐

  1. 转载:Objective-C中的 instancetype 和 id 关键字

    Objective-C中的instancetype和id关键字 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994 ...

  2. (转)Objective-C中的instancetype和id区别

    有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012Objective-C is a rapidly evolving language, ...

  3. instancetype和id的区别

    一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...

  4. 关于instancetype代替id的使用区别

    使用instancetype有三点好处: 1.明确性.代码只做你让它做的事,而不是其他. 2.程式化.你会养成好习惯,这些习惯在某些时候会很有用,而且肯定有用武之地. 3.一致性.让代码可读性更好. ...

  5. Objective-C中的instancetype和id关键字

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994913 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关 ...

  6. Objective-C中的instancetype和id区别

    有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012 Objective-C is a rapidly evolving language, ...

  7. instancetype 与 id for Objective-C

    instancetype vs id for Objective-C 新的LLVM编译器为我们带来了ARC, Object Literal and Scripting, Auto Synthesis等 ...

  8. ios android安全性分析,Android与iOS的对比分析及Android安全技术的设计与实现

    摘要: 近年来科技的发展和进步极大的推动了智能手机的飞速发展,手机功能的日益强大使人们对其依赖度显著上升.作为与人们生活密不可分通讯工具,手机安全的重要性不言而喻.现如今,随着手机网络的迅猛发展和形形 ...

  9. IOS获取设备 ID

    iOS获取设备 ID 命令行方式 $ xcrun simctl list 1 这行命令会列出你的所以模拟器信息,里面有类似 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 的 ...

最新文章

  1. 如何修复网站漏洞Discuz被挂马 快照被劫持跳转该如何处理
  2. 使用ssh-keygen生成私钥和公钥
  3. 图解notepad++插件使用
  4. 期末复习、化学反应工程科目(第六、七章)
  5. ConfigurationManager.AppSettings[] ConfigurationManager智能显示不出来
  6. mysql命令导入导出数据库_MYSQL命令行导入导出数据库详解
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的学校教务查询系统
  8. Discuz支持反对提示:抱歉您的请求来路不正确或表单无法提交的解决方法
  9. hdfs mv命令_Hadoop2.x HDFS shell命令
  10. 转:python命令行解析工具Argparse
  11. matlab中的imnoise信噪比,matlab语法fn=imnoise(f,'gaussian',0,0.02)是给f添加高斯噪声,其中数值0和0.02分别表示___和___?...
  12. 基于CNN的人脸相似度检测
  13. EPSON清零软件sscserve40使用方法
  14. 手机怎么压缩gif动图大小?推荐一款gif压缩的工具
  15. 学学习笔记:利用TCGA Assembler工具下载及处理数据
  16. 小甲鱼python教程视频怎么样-为什么我看完小甲鱼的python视频还是不会写呢?
  17. C:\Windows\System32\drivers\etc\hosts文件的作用说明
  18. 重庆—java互联网架构软件工程师学习记录—Day11(API 1)
  19. Android内部存储和外部存储以及缓存清理和内存清理!
  20. Win7 突然没声音 无法播放测试音调

热门文章

  1. python读取pptx
  2. 【Unity3D开发小游戏】《2D乒乓球游戏》Unity开发教程
  3. 令人发懵的“扇区”、“簇”、“块”、“页”
  4. 为什么要持续集成与持续部署
  5. mysql 字段命名is__数据库表字段命名规则
  6. rviz ros可视化工具
  7. 简要Windows性能监视器
  8. rmp安装gitlab10.1.0
  9. Linux多线程间通信和多进程间通信的方式
  10. idea使用Markdown流程图