码迷,mamicode.com
首页 > 其他好文 > 详细

oc 内存管理小结(**输出才是最好的学习**)

时间:2015-03-06 20:45:30      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

  • 引言

内存管理:清理(回收)不用的内存,以便内存能够再次利用。

这里就需要关注——怎样确定对象不再需要使用,并且其占用的内存可以被收回。

在Xcode4.2发布之前,oc内存管理全靠程序员自己,即手工管理内存计数。

在Xcode4.2版本之后,支持自动引用计数(Automatic Reference Counting,ARC),即摆脱手工管理,程序员从烦恼的内存管理问题中彻底解脱,oyeah~~

但是,为了理解过去遗留的代码,还是需要了解手工管理内存的原理。并且,也可以帮助coder们更明智地决定使用内存。

这里,推荐开启ARC功能(在build setting中)。

 

Apple支持的两种基本oc内存管理模式:

  1. 手工内存管理:手工引用计数和自动池释放
  2. 自动引用计数ARC
  • 手工内存管理——手工引用计数

何为引用计数?

每个对象都有一个与之关联的整数,被称作对象的引用计数(4字节)。

当有代码要访问该对象时,引用计数+1;

当不再访问时,引用计数-1;

对象建立时,引用计数初始=1;

当引用计数=0时,则对象就over了,即将被销毁,其占用的内存被系统回收以重用。

=================================================

引用计数涉及的方法:

创建对象:当使用alloc、new或者通过copy、mutableCopy创建一个对象时,对象的计数器设置为1.

*************这个时候可以说你,YOU,拥有这个对象,则你就负责该对象的内存管理(释放)。

                       注意,当以上面的alloc等为前缀的按照驼峰法则(首单词首字母小写,其余首字母大写,如smallBig)命名的方法都符合创建对象的规则。

                       这时可以有两种方法:

                       1.给对象发送release消息。  

                       2.给对象发送autorelease消息将其加入自动释放池。 

Object *obj1 = [[Object alloc] init];
//statement
[obj1 release];    

Object *obj2 = [[[Object alloc] init] autorelease];
//statement

增加对象访问:为保证对象的存在,每当创建引用到对象,则引用计数+1,此时可以给对象发送retain消息。

*************retain相关方法:                       

-(id) retain; //将对象计数器+1,同时返回该对象。    
-(NSUInteger) retainCount;  //返回当前计数器的值,NSLog中用%lu。

减少对象访问:当不再访问对象,则给对象发送release消息,计数器-1.

[obj release];

销毁对象:当对象的计数器为0,则系统自动调用dealloc销毁对象,注意是系统自动,千万不要手动调用deallo方法。

***********dealloc方法不可手动调用,但是可以重写。

                    例如对象A内拥有对象B,则在销毁对象A的dealloc方法中,需要添加释放对象A的语句。

                    下段代码仅供理解dealloc重写的意思,如有错误,请自行更改,(*^__^*) ~~

@interface A:NSObject
{
   B b;
}
@property B b; 
-(void) dealloc;
@end

@implementation A
@sythensize b;
-(void) dealloc
{
   [b dealloc];
   [super dealloc];//千万不要忘了
}
@end

ps:需要注意的是Foundation框架中的一些方法可能会增加对象的引用计数,如NSMutableArray的addObject:,或者UIView的addSubview:。有些方法会自动减少对象的引用计数,如removeObjectIndex:和removeFromSuperviewP:。

ps:如果对象已被销毁,对象引用失效,这个引用成为悬挂指针(dangling pointer),若给已释放的对象发送release消息,过度释放对象,会引起程序崩溃。

  • 手动内存管理——自动释放池

自动释放池(autorelease pool)可以帮助追踪需要延迟一些时间释放的对象,并自动释放。当给一个对象发送autorelease消息时,实际上是将该对象添加到自动释放池中。当自动释放池销毁时,会向池中的所有对象发送release消息。

有两种方法创建一个自动释放池:

  1. 通过@autoreleasepool关键字
  2. 通过NSAutoreleasePool对象

 

@autoreleasepool
{
    //statement      
}

NSAutoreleasePool *pool;
pool = [NSAutoreleasePool new];
//或者pool = [[NSAutoreleasePool alloc] init];
//...
//[obj autorelease];
//...
[pool release];

 

==========================================================

*************Cocoa手工内存管理规则*********

  • 当你使用new alloc 或copy方法创建一个对象时,该对象的保留计数器为1.当不再使用该对象时,你应该向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
  • 当你通过其他方法获得一个对象时,假设该对象的保留计数器为1,而且已经被设置为自动释放,那么你不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放他。
  • 如果你保留了某个对象,就需要最终释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。

详细介绍见 http://www.cnblogs.com/melody5417-bky/p/4314443.html

============================================================

 

oc 内存管理小结(**输出才是最好的学习**)

标签:

原文地址:http://www.cnblogs.com/melody5417-bky/p/4319111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!