iOS DeveloperiOS学习笔记iOS进阶指南

id , instancetype和__kindof的一些使用区

2017-08-08  本文已影响107人  Mark_Guan

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作为方法返回值的时候是看不到具体的返回值类型提示的.

上一篇下一篇

猜你喜欢

热点阅读