instancetype 和 id 的区别

原文:http://blog.csdn.net/sirodeng/article/details/50516478

一、什么是instancetype

instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象。我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢?

二、关联返回类型(related result types)

根据Cocoa的命名规则,满足下述规则的方法:

1、类方法中,以alloc或new开头

2、实例方法中,以autorelease,init,retain或self开头

会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法。换句话说,这些方法的返回结果以方法所在的类为类型,说的有点绕口,请看下面的例子:

[objc] view plaincopy

  1. @interface NSObject
  2. + (id)alloc;
  3. - (id)init;
  4. @end
  5. @interface NSArray : NSObject
  6. @end
当我们使用如下方式初始化NSArray时:

[objc] view plaincopy

  1. NSArray *array = [[NSArray alloc] init];
按照Cocoa的命名规则,语句[NSArray alloc] 的类型就是NSArray*因为alloc的返回类型属于关联返回类型。同样,[[NSArray alloc]init] 的返回结果也是NSArray*。

三、instancetype作用

1、作用

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

[objc] view plaincopy

  1. @interface NSArray
  2. + (id)constructAnArray;
  3. @end

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

[objc] view plaincopy

  1. [NSArray constructAnArray];
根据Cocoa的方法命名规范,得到的返回类型就和方法声明的返回类型一样,是id。

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

[objc] view plaincopy

  1. @interface NSArray
  2. + (instancetype)constructAnArray;
  3. @end
当使用相同方式初始化NSArray时:

[objc] view plaincopy

  1. [NSArray constructAnArray];
得到的返回类型和方法所在类的类型相同,是NSArray*!

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

2、好处

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

[objc] view plaincopy

  1. [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"
  2. [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)
上例中第一行代码,由于[[NSArray alloc]init]的结果是NSArray*,这样编译器就能够根据返回的数据类型检测出NSArray是否实现mediaPlaybackAllowsAirPlay方法。有利于开发者在编译阶段发现错误。

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

四、instancetype和id的异同

1、相同点

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

2、不同点

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

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

[objc] view plaincopy

  1. //err,expected a type
  2. - (void)setValue:(instancetype)value
  3. {
  4. //do something
  5. }
就是错的,应该写成:

[objc] view plaincopy

  1. - (void)setValue:(id)value
  2. {
  3. //do something
  4. }
时间: 2024-10-12 20:50:46

instancetype 和 id 的区别的相关文章

instancetype和id的区别

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

iOS instancetype和id的区别

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

OC中instanceType和id的区别

今天在学习oc的过程中遇到关于instanceType和id的问题不太明白.查了一些资料后,总结它们两个的区别和联系主要有以下几点: 相同点:instanceType和id都是作为方法的返回类型而被使用. 不同点: 1.instancetype可以返回和方法所在类相同类型的对象,id返回的类型只能是未知类型的对象: 对于简易构造函数,用instancetype更好一点,因为编译器因此会知道返回的是什么类型的方法对象,而用id则不会,它只会返回未知类型的对象: 2.instancetype在错误检

【iOS入门】instancetype和id的区别

区别1: 在ARC(Auto Reference Count)环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型. 在MRC(Manual Reference Count)环境下: instancetype和id一样,不做具体类型检查 区别2: id可以作为方法的参数,但instancetype不可以 instancetype只适用于初始化方法和便利构造器的返回值类型 作者:三木成森链接:https://www.jianshu.com

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开头 会

iOS instancetype 跟 id 的区别

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

instance和id的区别

instancetype和id的区别,objective-c instancetype   clang 3.5 提供的关键字,  表示:某方法返回未知类型的OC对象 都知道id任意类型关键字,为什么还会出现一个新的关键字? 返回关联类型 1.类方法中,alloc, new开头 2.实例方法中 autorelease,init,retain,self开头 会返回方法所在类的类型的对象,即关联返回类型的方法. 这些方法的返回结果以方法所在的类为类型. for example @interface N

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来定义一个简易的构造函数,到底区别在哪?

在接触OC语言一段时间后,我们大家都知道未知类型的对象可以用 id 表示,那么 instancetype 是用来干嘛的? 1.instancetype的作用 就是使那些非关联返回类型的方法返回所在类的类型 2.使用instancetype好处 a.能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题 b.编译器能够根据返回的数据类型检测是否实现方法,有利于开发者在编译阶段发现错误. 3.instancetype和id的异同 a.相同点 都可以作为方法的返回类型 b.不同点 ①insta