只是小人物

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、管理范围:任何继承了NSObject的对象,对基本数据类型无效

原理:

1.每个对象都有个引用计数器,是一个与之关联的整数

2.使用了alloc,new,copy等关键词会对对象的计数器计数为1

3.给对象发送一条retain消息,可以使对计数器+1

4.给对象发送一条release消息,可以使对计数器-1

5.当一个对象的的引用计数器的值为0时,那么它将被销毁,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法(类似遗言遗言),一定不要直接调用dealloc方法

- (void)dealloc{

    NSLog(@"%@被销毁了",self);

    [superdealloc];//一定要调用superdealloc方法,而且最好放在最后面调用

}

6.可以给对象发送retainCount消息获得当前的引用计数器值

 NSLog(@"count=%zi",[obj retainCount]);

 

 

二、内存管理的原则

1.谁创建,谁释放,如果你通过alloc,new或者copy创建一个对象,那么你必须调用release或autorelease,不是你创建的,就不用去释放

2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease

3.谁retain,谁release,如果调用了retain,就算没创建对象,也要release

 

三、自动释放池(autorelease pool)

自动释放池是OC里面一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。

当自动释放池销毁,池里所有对象都会调用一次release方法

 

如何将对象加入自动释放池?

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

autorelease实际上只是把对release的调用延迟了,系统只是把对象放入到池中,当池被释放时,所有池中对象就会调用一次release

//@autoreleasepool代表创建一个自动释放池(IOS5后)

@autoreleasepool{

  Student *stu = [[[Student alloc] init] autorlase];

}

 

一般可以写一个创建对象的静态方法

+ (id)student{//潜规则,方法名和类名一致,开头字母改为小写

  Student *stu = [[[Student alloc] init] autorlase];

  return stu;

}

 

 

autoreleasepool注意

1.不要把大量循环操作昂到同一个自动释放池(NSAutoreleasePool)之间,这样会造成内存峰值上升

2.尽量避免打对大内存使用该方法

3.SKD中一般利用静态方法创建的对象都已经是 autorelease的,不需要在进行release操作

 

posted on 2014-01-10 13:58  只是小人物  阅读(173)  评论(0编辑  收藏  举报