一、说明
相同点:
instancetype 和 id 都是指针,指向对象
不同点:
1.id在编译的时候不能判断对象的真实类型,也就是说在编译器不做具体类型检查,运行时检查类型,instancetype在编译的时候可以判断对象的真实类型
2.id可以用来定义变量,可以作为返回类型,可以作为形参类型;instancetype只适用于初始化方法和便利构造器的返回值类型
二、例子
我们看一个例子,这两种类型是如何在编译阶段确定类型的 ,我们声明一个类 ClassA
@interface ClassA : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)getACopy;
- (id)getAnotherCopy;
@end
#import "ClassA.h"
@implementation ClassA
- (instancetype)getACopy {
ClassA *instance = [ClassA new];
instance.name = @"name";
return instance;
}
- (id)getAnotherCopy {
ClassA *class = [ClassA new];
class.name = @"name";
return class;
}
@end
最后我们在 ViewController 中,分别对 getACopy 和 getAnotherCopy 进行调用,我们可以看到会有如下错误信息提示
Pasted Graphic.jpg
三、总结
类型检查分动态和静态的。动态的在运行时做检查,静态的是由clang在编译时做检查,静态检查是为了帮助开发人员在编写代码的时候,查找错误
网友评论