Objective-C中的instancetype和id关键字
作者:wangzz
一、什么是instancetype
instancetype 是clang3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的对象可以用id关键字表示,那为什么还会有一个instancetype呢?
二、关联返回类型(related result typeset)
根据Cocoa的命名规则,满足下述规则的方法:
1、类方法中, 以alloc或 new 开头
2、实例方法中,以autorelease,init,retain 或 self 开头
会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法。换句话说,这些方法的返回方法的类为类型,说的有点绕口,

@interface NSObject
+ (id)alloc; //类方法
- (id)init; //实例方法
@end @interface NSArray : NSObject
@end

当我们使用如下方式初始化NSArray时:

NSArray *array = [[NSArray alloc] init];  

按照Cocoa的命名规则,语句[NSArray alloc] 的类型就是[[NSArray alloc]init] 的返回结果也是NSArray*。

三、instancetype作用

1,作用

如果一个不是关联返回类型的方法,如下:

@interface NSArray
+ (id)constructAnArray;
@end

当我们使用如下方式初始化NSArray时:

[NSArray constructAnarray];

根据Cocoa的方法命名规范,得到的返回类型就和方法声明的返回类型一样,是id。

但是如果使用instancetype作为返回类型,如下:

@interface NSArray
+ (instancetype)constructAnArray;
@end

当使用相同方式初始化NSArray时:

[NSArray constructAnArray];

得到的返回类型和方法所在类的类型相同,是NSArray*

总结,instancetype的作用 就是使那些非关联返回类型的方法  返回所在类的类型。

2、好处

能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题,比如:

[[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`" 

[[NSArray array] medaPlaybackAllowsAirPlay];  // (No error) 

上例中第一行代码,由于[[NSArrayalloc]init]的结果是NSArray*,这样编译器就能够根据返回的数据类型检测出NSArray是否实现mediaPlaybackAllowsAirPlay方法。有利于开发者在编译阶段发现错误。

第二行代码,由于array不属于关联返回类型方法,[NSArrayarray]返回的是id类型,编译器不知道id类型的对象是否实现了mediaPlaybackAllowsAirPlay方法,也就不能够替开发者及时发现错误。

四、instancetype和id的异同

1、相同点

都可以作为方法的返回类型

2、不同点

①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

②instancetype只能作为返回值,不能像id那样作为参数,比如下面的写法:

    //err,expected a type
- (void)setValue:(instancetype)value
{
//do something
}

就是错的,应该写成:

    - (void)setValue:(id)value
{
//do something
}

五、参考

1、http://nshipster.com/instancetype/

2、http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features

转载:Objective-C中的 instancetype 和 id 关键字的更多相关文章

  1. Objective-C中的instancetype和id关键字(转)

    转自:Objective-C中的instancetype和id关键字 一.什么是instancetype 同id一样,都是表示未知类型的的对象. 二.关联返回类型(related result typ ...

  2. 【转】Objective-C中的instancetype和id关键字

    原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5 ...

  3. Objective-C中的instancetype和id…

    作者:韩俊强 原文地址:http://control.blog.sina.com.cn/admin/article/article_add.php 转载请注明出处 一.什么是instancetype ...

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

    目录(?)[-] 有一个相同两个不同相同 Written by Mattt Thompson on Dec 10th 2012 一什么是instancetype 二关联返回类型related resu ...

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

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

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

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

  7. Object-C开发之instancetype和id关键字

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

  8. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

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

    要区分instancetype和id,首先要弄清楚什么是关联返回类型(Related Result Type). 关联返回类型即一个方法的返回类型就是调用这个方法的调用者的类型.具有下列条件的方法具有 ...

随机推荐

  1. ivy,ivyde插件-eclipse

    官方共享更新磁盘下载 http://www.apache.org/dist/ant/ivyde/updatesite/ http://ant.apache.org/ivy/download.cgi 简 ...

  2. 【USACO 1.5】Prime Palindromes

    /* TASK: pprime LANG: C++ SOLVE: 枚举数的长度,dfs出对称的数,判断是否在范围内,是否是素数 原来想着枚举每个范围里的数,但是显然超时,范围最大是10^9. 对称的数 ...

  3. bzoj1042: [HAOI2008]硬币购物

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  4. BZOJ2432 [Noi2011]兔农

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. codeforces 580D:Kefa and Dishes

    Description When Kefa came to the restaurant and sat at a table, the waiter immediately brought him ...

  6. 安装Mysql提示1045错误解决方法

    MySQL安装提示一下错误 The security settings could not be applied to the database because the connection has ...

  7. MongoDB: CURD操作

    >> 创建:·db.foo.insert({"bar":"baz"}) //如果文档中没有"_id"键会自动增加一个·db.fo ...

  8. MVC5-5 Razor引擎及视图结构

    View结构 其实给我们提供了官方的MvcDemo,就是在我们直接去新建一个不为空的MVC项目. 这里就是一个MVC的Demo了,可以看一下这个Demo中View的结构是什么 上图可以发现,有一个Sh ...

  9. 树链剖分I 原理

    树链剖分(Heavy Light Decomposition, HLD)是一种将对[树上两点间的路径]上[边或点]的[修改与查询]转化到[序列]上来处理的方法. 目的:将树的边或点转化到一个线性结构( ...

  10. [Eclipse]解决: Eclipse Maven “Add Dependency”搜索无结果

    转载: http://www.educity.cn/wenda/469389.html eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't w ...