相同点:
- 都可以表示任何对象类型;
不同点:
- id可以用作返回值和参数;instance只能用作返回值类型;
- 编译器会监测instance对象的真实类型。
代码比较
id作为返回值类型
+ (id)person {
return [[self alloc] init];
}
- (id)init {
if (self = [super init]) {
NSLog(@"id");
}
return self;
}
instance 作为返回值类型
+ (instancetype)person {
return [[self alloc] init];
}
- (instancetype)init {
if (self = [super init]) {
NSLog(@"instancetype");
}
return self;
}
创建Person类型对象
/*
id:编译通过,不会用警告
instance:提示警告,接收对象的指针类型不匹配
*/
NSString * person = [Person person];
总结:
凡是作为返回值类型时,一律用instance,可以在编译后,发现类型不匹配的对象,避免其他问题。