instancetype 与 id for Objective-C

instancetype 与 id for Objective-C

分类: IOS2014-03-17 10:01 187人阅读 评论(0) 收藏 举报

instancetype vs id for Objective-C

新的LLVM编译器为我们带来了ARC, Object Literal and Scripting, Auto Synthesis等特性,同时也引入了instancetype关键字。instancetype用来表示Related Result Types(相关返回类型),那么它与id有什么不同呢?

根据Cocoa的命名惯例,init, alloc这类的方法,如果以id作为返回类型,会返回类本身的类型。

1
2
3
@interface Person
- (id)initWithName:(NSString *)name;
+ (id)personWithName:(NSString *)name;

但类方法的返回类型,LLVM(或者说Clang)却无法判断,我们来看一段代码:

1
2
3
// You may get two warnings if you‘re using MRC rather than ARC
[[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; // ? "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"
[[NSArray array] mediaPlaybackAllowsAirPlay]; // It‘s OK. But You‘ll get a runtime error instead of a compile time one

[NSArray array]除非显式转换为(NSArray *),否则编译器不会有错误提示。如果使用instancetype就不会有这样的问题:

1
2
3
@interface Person
- (instancetype)initWithName:(NSString *)name;
+ (instancetype)personWithName:(NSString *)name;

简单来说,instancetype关键字,保证了编译器能够正确推断方法返回值的类型。这种技术基本从iOS 5的UINavigationController里就开始应用了。

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

时间: 2024-10-25 03:17:18

instancetype 与 id for Objective-C的相关文章

iOS 用instancetype代替id作返回类型有什么好处?

2014-07-07更新:苹果在iOS 8中全面使用instancetype代替id Steven Fisher:只要一个类返回自身的实例,用instancetype就有好处. @interface Foo:NSObject - (id)initWithBar:(NSInteger)bar; // initializer + (id)fooWithBar:(NSInteger)bar; // convenience constructor @end 对于简易构造函数(convenience co

[iOS]用instancetype代替id作返回类型有什么好处?(转)

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:管策链接:http://zhuanlan.zhihu.com/Foundation/19569459来源:知乎 2014-07-07更新:苹果在iOS 8中全面使用instancetype代替id Steven Fisher:只要一个类返回自身的实例,用instancetype就有好处. @interface Foo:NSObject - (id)initWithBar:(NSInteger)bar; // initial

iOS instancetype和id的区别

区别: 1>instancetype在类型表示上,跟id一样,可以表示任何对象类型 2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上 3>instancetype比id多一个好处:编译器会检测instancetype的真实类型 第3点的解释: 在下面这种情况下 // Person.m文件里 + (id)person{ return [[self alloc] init]; } // mainViewController.m,下面这行代码,用字符串类型的指针指

instancetype与id

?instancetype在类型表示上,跟id一样,可以表示任何对象类型 ?instancetype只能用在返回值类型上,不能像id一样用在参数类型上 ?instancetype比id多一个好处:编译器会检测instancetype的真实类型 instancetype与id,布布扣,bubuko.com

instancetype和id的区别

一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? 二.关联返回类型(related result types) 根据Cocoa的命名规则,满足下述规则的方法: 1.类方法中,以alloc或new开头 2.实例方法中,以autorelease,init,retain或self开头 会

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

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? 二.关联返回类型(related result types) 根据Cocoa的命名规则,

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

转自:Objective-C中的instancetype和id关键字 一.什么是instancetype 同id一样,都是表示未知类型的的对象. 二.关联返回类型(related result types) 根据Cocoa的命名规则,满足下述规则的方法: 1.类方法中,以alloc或new开头 2.实例方法中,以autorelease,init,retain或self开头 会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法.换句话说,这些方法的返回结果以方法所在的类为类型,说的

Objective-C中的instancetype与id的区别

一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? 二.关联返回类型(related result types) 根据Cocoa的命名规则,满足下述规则的方法: 1.类方法中,以alloc或new开头 2.实例方法中,以autorelease,init,retain或self开头 会

Objective-C中的instancetype和id区别

目录(?)[-] 有一个相同两个不同相同 Written by Mattt Thompson on Dec 10th 2012 一什么是instancetype 二关联返回类型related result types 三instancetype作用 作用 好处 四instancetype和id的异同 相同点 不同点 有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012 Objective-C is a rapidly evolving

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

原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? 二.关联返回类型(related result types) 根据Cocoa的命名规则,满足下述规则的方法: 1