不管是iOS原生方法还是平时自己写方法,都能碰到instancetype
和id
,那么这两者有何区别呢?
一、instancetype
和 id
的异同
相同点:instancetype
是clang 3.5
开始提供的一个关键字,跟id
类似,用于表示某个方法返回的未知类型的Objective-C
对象。
不同点:
instancetype
只能作为返回值类型,id
不仅可以作为返回值类型也可以当作参数使用。instancetype
作为返回值类型返回值时,编译器会检测其真实类型,id
则没有该功能。
举个例子:创建一个Student
类,如下
@interface Student : NSObject
+ (instancetype)student;
//+ (id)student;
@end
+ (instancetype)student
{
return [[[self class] alloc] init];
}
// 创建一个Student
类的对象,用NSString
来接收student
对象
NSString *student = [Student student];
NSLog(@"%@",student);
当使用instancetype
时,会有一个警告意思是类型不匹配;如果使用id
作为返回值则不会有该警告。
二、alloc、init
与new
的异同
alloc
:分配内存方法;init
:初始化方法;new
:该关键字代替上面两个函数,分配内存,并且初始化。
异同点:使用new
关键字初始化时,初始化方法会默认执行init
方法,不能调用其他的initMethod
自定义的初始化方法;如果想重写复杂的初始化建议不要使用new
关键字;方法如果只是想简单的初始化一个对象,使用new
和alloc、init
完全一样的。
验证下:我们重写init
方法
- (instancetype)init
{
self = [super init];
if (!self) return nil;
NSLog(@"我是通过 new 或者 init 过来的");
return self;
}
创建两个Student类的对象:
Student *student = [[Student alloc] init];
Student *student2 = [Student new];
控制台打印结果:
参考官方文档