id , instancetype和__kindof的一些使用区别

instancetypeid

在开发中我们经常会用到instancetypeid,那么他们二者之间有什么区别呢?

我们首先创建一个工程,新建一个Animal类和一个Dog类,并且Dog类继承自Animal类.

Animal.m

Dog类继承自Animal

ViewController中我们对Dog进行实例化,并且随便调用一个setFrame方法,然后Command+B进行编译,居然没有报错;

然后我们将initObject的返回值类型改为instancetype,此时XCode马上就给了我们一个错误的提示:

idinstancetype的比较:

相同点:
instancetypeid 都是万能指针,指向对象。

不同点:
1.id在编译的时候不能判断对象的真实数据类型,而instancetype在编译的时候可以判断对象的真实类型
2.id可以用来定义变量,可以作为返回值类型,可以作为方法参数类型;而instancetype只能作为返回值类型

综上所述,如果以后凡是自定义构造方法,返回值类型尽量使用`instancetype`,不要使用`id` 

__kindof

表示当前类对象或者它的子类对象;
对于__kindof我们来查看下经常使用的一个方法:

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

该方法表明返回值类型是UITableViewCell类型或者是它的子类对象类型;

为了更加明确的说明__kindof的使用,我们还是拿上面的那个例子:我们将initObject的返回值类型改为如下所示:

我们在调用方法时,通过返回值的提示, 可以看到具体的返回值类型, Animal类型或者是它的子类对象:

instancetypeid作为方法返回值的时候是看不到具体的返回值类型提示的.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 5,016评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 4,776评论 0 4
  • Objective-C 1. import的用法 拷贝文件内容可以自动防止文件的内容被重复拷贝(#define宏定...
    马文涛阅读 10,712评论 3 17
  • 大纲 0.OC数据类型 1.声明一个类 2.实现一个类 3.创建一个对象 4.对象的注意点 5.对象方法 6.类方...
    天天想念阅读 4,809评论 0 3
  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new ...
    yeshenlong520阅读 6,815评论 0 9