1、应用场景 经常用来在类方法中快速完成对象创建 例如: Person类有一个类方法 - +(instancetype)createPerson{
- return [[[Person alloc] init] autorelease];
- }
复制代码
这样可以快速创建一个对象,并管理对象内存,使用如下 - @autoreleasepool {
- Person *p = [Person createPerson];
- }
复制代码打印结果 2015-10-06 21:11:14.086 MRCDemo[2956:303] This persondead.... 【结果分析】Person的计数器为0时会自动调用方法 - -(void)dealloc{
- NSLog(@"This person dead....");
- [super dealloc];
- }
复制代码
,由结果可知,createPerson不仅创建了对象,还管理了该对象的内存。 与系统中的有些类快速创建对象是一样的道理,例如:- NSArray *arry = [NSArray array];
- NSDictionary *dic = [NSDictionary dictionary];
复制代码
2、如果Student类继承了Person类,Person类如1中所说使用了快速创建对象,那么Student类可以快速创建对象么? 例如: Student类中重写了dealloc方法: - -(void)dealloc{
- NSLog(@"Student is dead...");
- [super dealloc];
- }
复制代码
main.m文件中: - @autoreleasepool {
- //动态类型绑定,在运行时确定是Person类
- Student *st = [Student createPerson];
-
- }
复制代码
打印结果: 2015-10-06 21:25:36.017 MRCDemo[3051:303] This persondead.... 【分析结果】这样是不行的,此时类方法createPerson创建的是Person实例对象 【正确做法】 - +(instancetype)createPerson{
- //创建的是Person类实例对象
- return [[[self alloc] init] autorelease];
- }
复制代码
此处self指代调用该类方法的类 此时打印结果: 2015-10-06 21:29:46.372 MRCDemo[3078:303] Student isdead... 2015-10-06 21:29:46.373 MRCDemo[3078:303] This persondead.... 【分析结果】 由结果可知,这样做可以让Person类的子类也能快速创建对象,并管理内存
3、存在问题 如果+createPerson的返回值是id的话,那么以下语句在编译时不会报错: - NSString *st = [Student createPerson];
- [st length];
复制代码
但是运行时会报错,因为createPerson创建的是一个student对象,它根本没有length方法。因此要用instancetype,因为instancetype可以智能判断赋值的指针变量类型和方法返回类型是否一致
|