黑马程序员技术交流社区

标题: OC学习笔记之autorelease的应用场景 [打印本页]

作者: chunhuayun    时间: 2015-10-8 08:19
标题: OC学习笔记之autorelease的应用场景
1、应用场景
经常用来在类方法中快速完成对象创建
例如:
Person类有一个类方法
  1. +(instancetype)createPerson{
  2.     return  [[[Person alloc] init] autorelease];
  3. }
复制代码

这样可以快速创建一个对象,并管理对象内存,使用如下
  1.     @autoreleasepool {
  2.         Person *p = [Person createPerson];
  3.     }
复制代码
打印结果
2015-10-06 21:11:14.086 MRCDemo[2956:303] This persondead....
【结果分析】Person的计数器为0时会自动调用方法
  1. -(void)dealloc{
  2.         NSLog(@"This person dead....");
  3.     [super dealloc];
  4. }
复制代码


,由结果可知,createPerson不仅创建了对象,还管理了该对象的内存。
与系统中的有些类快速创建对象是一样的道理,例如:
  1.        NSArray *arry = [NSArray array];
  2.         NSDictionary *dic = [NSDictionary dictionary];
复制代码


2、如果Student类继承了Person类,Person类如1中所说使用了快速创建对象,那么Student类可以快速创建对象么?
例如:
Student类中重写了dealloc方法:
  1. -(void)dealloc{
  2.     NSLog(@"Student is dead...");
  3.     [super dealloc];
  4. }
复制代码


main.m文件中:
  1.     @autoreleasepool {
  2. //动态类型绑定,在运行时确定是Person类
  3.         Student *st = [Student createPerson];
  4.         
  5.     }
复制代码


打印结果:
2015-10-06 21:25:36.017 MRCDemo[3051:303] This persondead....
【分析结果】这样是不行的,此时类方法createPerson创建的是Person实例对象
【正确做法】
  1. +(instancetype)createPerson{
  2.     //创建的是Person类实例对象
  3.     return  [[[self alloc] init] autorelease];
  4. }
复制代码

此处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的话,那么以下语句在编译时不会报错:
  1.         NSString *st = [Student createPerson];
  2.         [st length];
复制代码

但是运行时会报错,因为createPerson创建的是一个student对象,它根本没有length方法。
因此要用instancetype,因为instancetype可以智能判断赋值的指针变量类型和方法返回类型是否一致






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2