instancetype
和id
在开发中我们经常会用到instancetype
和id
,那么他们二者之间有什么区别呢?
我们首先创建一个工程,新建一个Animal
类和一个Dog
类,并且Dog
类继承自Animal
类.
Animal.m
Dog
类继承自Animal
类
在ViewController
中我们对Dog
进行实例化,并且随便调用一个setFrame
方法,然后Command+B
进行编译,居然没有报错;
然后我们将initObject
的返回值类型改为instancetype
,此时XCode马上就给了我们一个错误的提示:
id
和 instancetype
的比较:
相同点:
instancetype
和 id
都是万能指针,指向对象。
不同点:
1.id
在编译的时候不能判断对象的真实数据类型,而instancetype
在编译的时候可以判断对象的真实类型
2.id
可以用来定义变量,可以作为返回值类型,可以作为方法参数类型;而instancetype
只能作为返回值类型
综上所述,如果以后凡是自定义构造方法,返回值类型尽量使用`instancetype`,不要使用`id`
__kindof
表示当前类对象或者它的子类对象;
对于__kindof
我们来查看下经常使用的一个方法:
- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
该方法表明返回值类型是UITableViewCell
类型或者是它的子类对象类型;
为了更加明确的说明__kindof
的使用,我们还是拿上面的那个例子:我们将initObject
的返回值类型改为如下所示:
我们在调用方法时,通过返回值的提示, 可以看到具体的返回值类型, Animal
类型或者是它的子类对象:
而instancetype
和id
作为方法返回值的时候是看不到具体的返回值类型提示的.