黑马程序员技术交流社区
标题: OC学习笔记之autorelease的应用场景 [打印本页]
作者: chunhuayun 时间: 2015-10-8 08:19
标题: OC学习笔记之autorelease的应用场景
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可以智能判断赋值的指针变量类型和方法返回类型是否一致
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |