id 和 instancetype 的区别

1.什么是 instancetype?
同 id 一样,都是表示未知类型的对象.

2.关联返回类型的方法
根据 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];
语句[NSArray alloc]的类型就是 NSArray *,因为 alloc 属于关联返回类型的方法,同样,
[[NSArray alloc]init] 的返回结果也是NSArray *.

3.instancetype 的作用和好处
1.作用
如果一个不是关联返回类型的方法,如下:
@interface NSArray
+ (id)constructAnArray;
@end
当我们使用如下方式初始化 NSArray 时,
[NSArray constructAnArray];
得到的返回类型就和方法声明的返回类型一样,是 id.
但是如果使用 instancetype 作为返回类型,如下:
@interface NSArray
+ (instancetype)constructAnArray;
@end
得到的返回类型和方法所在类的类型相同,是 NSArray *.
总结一下,instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!
2.好处
能够确定对象类型,帮助编译器更换好的定位代码书写问题
[[[NSArray alloc] init] mediaPlaybackAllowsAirPlay];
[[NSArray array] mediaPlaybackAllowsAirPlay];
第一行代码由于[[NSArray alloc]init]的结果是NSArray*,这样编译器就能够根据返回的数据类型检测出NSArray是否实现mediaPlaybackAllowsAirPlay方法。有利于开发者在编译阶段发现错误
第二行代码,由于array不属于关联返回类型方法,[NSArray array]返回的是id类型,编译器不知道id类型的对象是否实现了mediaPlaybackAllowsAirPlay方法,也就不能够替开发者及时发现错误。

时间: 2024-10-08 06:33:55

id 和 instancetype 的区别的相关文章

id 和 instancetype

静态数据类型 默认情况下所有的数据类型都是静态数据类型 静态数据类型的特点: 1 在编译时就知道变量的类型 2 知道变量中有哪些属性和方法 3 在编译的时候就可以访问这些属性和方法 4 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错 动态数据类型 id 是一个动态数据类型 动态数据类型的特点 1 在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型 2 并且如果通过动态数据类型定义变量,如果访问了不属于动态类型的属性和方法

id和NSObject *和instanceType的区别与联系

id 被成为万能指针,也就是可以指向任何对象. NSObject * 本身就是定义指向NSObject类型的指针. 那么这两者有什么区别吗? 这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区别则在于id修饰的变量不遵循<NSObject>协议.这在实现代理模式中会体现出其区别,例如在调用代理方法时会先判断该代理是否能够响应某个方法  [obj respondsToSelector:]就定义在NSObject协议中. 那么,苹果后来为什么有使用instancType呢? 我觉得主要原因

id 和 instancetype 方法的区别

首先明确 id 和 instancetype 都是万能指针,都能指向一个对象:(instancetype == id == 万能指针 == 指向一个对象) 主要区别亮点: 1. id 在编译时候不能判断对象的真是类型,但是instancetype 编译的时候可以判断对象真是类型,这样的话,编写代码时候,如果类型指错,instancetype可以告警.我们应该尽量把告警暴露在编译的时候. 2.另外  instancetype 只能用来做返回值,不能和id一样定义变量. // id在编译的时候不能判

id和instancetype区别

id和instancetype区别 作用 instancetype:可以返回明确的类型,但不能作为参数类型. id:可以用来表示变量和方法参数的类型.如果程序运行时无法确定一个对象的类型,就可以将该对象声明为id. 异同 1.相同点 都可以作为方法的返回类型 2.不同点 instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象: instancetype只能作为返回值,不能像id那样作为参数 推荐用法 作为返回值时,使用instancetype. 作为参数时,只能使

id、NSObject *、id&lt;NSObject&gt;、instancetype的区别

1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法.更一步来说:所有的对象本质来说都是 id 类型的. (2) 对于id来说,你可以调用任意可见的selector,编译器和IDE不会进行类型检查,这个时候就需要你自己进行类型检查并且进行

iOS开发中id、NSObject *、id、instancetype四者有什么区别?

在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id.NSObject *.id.instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看了一些iOS开发教程和文档,搜罗了他们的不同用法,分享给大家,一起来看看吧. 1. id与NSObject * (1)id是Objective-C对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与NS

id和instancetype的异同

相同点: 都可以作为方法返回值类型 在initWithName:方法中是一样的,例如: - (id)initWithName:(NSString *)name; - (instancetype)initWithName:(NSString *)name; 编译器在编译时直接将id转换成instancetype类型 不同点: 1.instancetype只能作为返回值类型,不能像id一样作为参数类型; 2.作为返回值类型时,在自定义方法中也有不同之处 + (id)constructAnArray;

android:id=&quot;@android:id/tabhost&quot; 、android:id=&quot;@+id/llRoot&quot; 、android:id=&quot;@id/llRoot&quot; 之间的区别

由于快要放暑假了,所以最近这俩周把Android方面的知识复习一下,准备找个实习工作. 顺便把自己的总结更大家分享一下,共同进步,谢谢.... 一. android:id="@android:id/tabhost"   是调用系统内部的ID 和代码中 mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent); 是一回事. 二. android:id="@+id/llRoot&q

在表单(input)中id和name的区别

在表单(input)中id和name的区别  但是name在以下用途是不能替代的: 1. 表单(form)的控件名,提交的数据都用控件的name而不是id来控制.因为有许多name会同时对应多个控件,比如checkbox和radio,而id必须是全文档中唯一的.此外浏览器会根据name来设定发送到服务器的request.因此如果用id,服务器是无法得到数据的. 2. frame和window的名字,用于在其他frame或window指定target. 例如:<frameset cols="