本文共 1016 字,大约阅读时间需要 3 分钟。
不管是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];
控制台打印结果:
。
转载地址:http://cgivi.baihongyu.com/