Objective-C的自动释放池(autoreleasepool)、静态方法快速创建对象

来源:互联网 发布:淘宝信鸽 编辑:程序博客网 时间:2024/06/10 05:26

自动释放池(autorelease pool)

1、是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收
2、当自动释放池销毁时,池里面的所有对象都会调用一次release方法

方法:
(a)OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)

(b)autorelease实际上只是把release的调用延迟了,对于每一次autorelease,系统只是把对象放入了当时的
autorelease pool中,当该pool被释放时,该pool中的对象会被调用release。

//创建一个自动释放池
@autoreleasepool{
   Student * stu = [[Student alloc] init];

   [stu autorelease]; //这句的意思是把对象放到autoreleasepool 的池子中,不会改变对象计数器,只是把对象放到池子中
}

当自动释放池被销毁的时候,所有对象自动调用release方法

静态方法快速创建OC对象:

静态方法返回的对象,是自动释放的。不需要管理内存。因此,自己创建的静态方法,最好也要保证对象是自动释放的。

如果一个类要创建一个方法来快速创建对象的话,方法名和类名称一样,并且方法名小写
@interface Student:NSObject
//静态方法,快速创建给一个对象
+(id) student;

@end;

@implementation Student

+(id) student{
      Student * stu = [ [[Student alloc] init]  autorelease];
      return stu;
}
@end

int main(int argc, const char * argv[]){
     @autoreleasepool{
 Student * stu = [Student student];
     } 
}

使用自动释放池的注意事项:

1、在ARC环境下,不能使用[[NSAutoreleasePool alloc] init],而应当使用@autoreleasepool
2、在@autoreleasepool中要尽量避免用循环的方式创建大量对象。这样会造成内存峰值的上升
3、尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用
4、sdk中一般利用静态方法创建并返回的对象都是已经autorelease的,不需要再进行release 操作