iOS:instancetype 对比 id 的好处
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 的好处相关推荐
- 转载:Objective-C中的 instancetype 和 id 关键字
Objective-C中的instancetype和id关键字 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994 ...
- (转)Objective-C中的instancetype和id区别
有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012Objective-C is a rapidly evolving language, ...
- instancetype和id的区别
一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...
- 关于instancetype代替id的使用区别
使用instancetype有三点好处: 1.明确性.代码只做你让它做的事,而不是其他. 2.程式化.你会养成好习惯,这些习惯在某些时候会很有用,而且肯定有用武之地. 3.一致性.让代码可读性更好. ...
- Objective-C中的instancetype和id关键字
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994913 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关 ...
- Objective-C中的instancetype和id区别
有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012 Objective-C is a rapidly evolving language, ...
- instancetype 与 id for Objective-C
instancetype vs id for Objective-C 新的LLVM编译器为我们带来了ARC, Object Literal and Scripting, Auto Synthesis等 ...
- ios android安全性分析,Android与iOS的对比分析及Android安全技术的设计与实现
摘要: 近年来科技的发展和进步极大的推动了智能手机的飞速发展,手机功能的日益强大使人们对其依赖度显著上升.作为与人们生活密不可分通讯工具,手机安全的重要性不言而喻.现如今,随着手机网络的迅猛发展和形形 ...
- IOS获取设备 ID
iOS获取设备 ID 命令行方式 $ xcrun simctl list 1 这行命令会列出你的所以模拟器信息,里面有类似 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 的 ...
最新文章
- 如何修复网站漏洞Discuz被挂马 快照被劫持跳转该如何处理
- 使用ssh-keygen生成私钥和公钥
- 图解notepad++插件使用
- 期末复习、化学反应工程科目(第六、七章)
- ConfigurationManager.AppSettings[] ConfigurationManager智能显示不出来
- mysql命令导入导出数据库_MYSQL命令行导入导出数据库详解
- 基于JAVA+SpringMVC+Mybatis+MYSQL的学校教务查询系统
- Discuz支持反对提示:抱歉您的请求来路不正确或表单无法提交的解决方法
- hdfs mv命令_Hadoop2.x HDFS shell命令
- 转:python命令行解析工具Argparse
- matlab中的imnoise信噪比,matlab语法fn=imnoise(f,'gaussian',0,0.02)是给f添加高斯噪声,其中数值0和0.02分别表示___和___?...
- 基于CNN的人脸相似度检测
- EPSON清零软件sscserve40使用方法
- 手机怎么压缩gif动图大小?推荐一款gif压缩的工具
- 学学习笔记:利用TCGA Assembler工具下载及处理数据
- 小甲鱼python教程视频怎么样-为什么我看完小甲鱼的python视频还是不会写呢?
- C:\Windows\System32\drivers\etc\hosts文件的作用说明
- 重庆—java互联网架构软件工程师学习记录—Day11(API 1)
- Android内部存储和外部存储以及缓存清理和内存清理!
- Win7 突然没声音 无法播放测试音调
热门文章
- python读取pptx
- 【Unity3D开发小游戏】《2D乒乓球游戏》Unity开发教程
- 令人发懵的“扇区”、“簇”、“块”、“页”
- 为什么要持续集成与持续部署
- mysql 字段命名is__数据库表字段命名规则
- rviz ros可视化工具
- 简要Windows性能监视器
- rmp安装gitlab10.1.0
- Linux多线程间通信和多进程间通信的方式
- idea使用Markdown流程图