将autorelease写入类方法的例子
1、出发点:在autoreleasepool中如:
@autoreleasepool {
Person * p = [[ init] autorelease];
......
}
红色部分代码经常需要重复性写,所以需要想个办法将该代码省略掉或替换掉,因此才有了使用一个类方法来返回初始化并autorelease的方法来解决该问题
+ (id)person
{
return [[ init] autorelease];
}
然后在创建对象时,只需要Person * p = ;即可
2、既然通过一个类方法可以完成上述功能,在此基础之上其实还可以完成更多的功能,比如顺便传递一个参数进去进行初始化对象,类似初始化方法能完成的功能;
+ (id)personWithAge:(int)age
{
Person * p = ;
p.age = age;
return p;
}
这样一来即完成了初始化+autorelease并将age初始值传到创建的对象中
3、考虑到子类也需要用到此方法,可以将self替换掉Person更为严谨,否则子类只能重写该方法;
参考代码:
Person.h
//
//Person.h
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, assign) int age;
// 声明一个带自动释放功能的类方法
+ (id)person;
// 声明一个带自动释放且传age参数的类方法
+ (id)personWithAge:(int)age;
@end
Person.m
//
//Person.m
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "Person.h"
@implementation Person
+ (id)person
{
//直接返回带初始化与autorelease的对象,省去在创建方法时重复的代码
return [[ init] autorelease];
}
// 对类方法person进行升级改造,不仅可完成初始化与自动释放,还可以接受一个age的参数给新对象,扩展了原始方法的功能
+ (id)personWithAge:(int)age
{
// 创建一个对象并调用person方法完成初始化与自动释放的功能,考虑到子类的使用,用self表示当前类的行为
// 这需要与person方法结果,person方法同样用self来表示当前类
Person * p = ;
// 如果子类继承该方法,由于"多态"的特性,创建一个Person类型的指针,指向一个Student类型的对象是完全没有问题的
// 对象分配空间并初始化之后将该对象的age赋值
p.age = age;
// 返回该对象为方法调用者
return p;
}
- (void)dealloc
{
// 在释放之前输出一行信息,直观表示该方法被调用,使用对象本身与_age来区分具体对象
NSLog(@"%@ is dealloc, age = %d", self, _age);
;
}
@end
Student.h
//
//Student.h
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "Person.h"
@interface Student : Person
@property (nonatomic, assign) double height;
@end
Student.m
//
//Student.m
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "Student.h"
@implementation Student
@end
main.m
//
//main.m
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "student.h"
int main()
{
// 创建一个自动释放池
@autoreleasepool{
// Person * p = ;
// 创建一个Person对象并使用personWithAge:方法进行初始化,检验自动释放池被释放后该对象是否会自动释放
Person * p = ;
// 创建一个Person子类Student对象,子类继承父类的功能,是否能够达到同样的效果
Student * s = ;
// 创建对象成功的标志,即对象可对新成员变量(父类中没有的)进行操作
s.height = 173;
NSLog(@"s.height = %.2f", s.height);
}
return 0;
}
运行结果:2014-03-19 23:05:36.560 Autorelease-1 s.height = 173.002014-03-19 23:05:36.561 Autorelease-1 <Student: 0x100107b60> is dealloc, age = 122014-03-19 23:05:36.562 Autorelease-1 <Person: 0x100102fe0> is dealloc, age = 20Program ended with exit code: 0
页:
[1]