标签:
内存管理:清理(回收)不用的内存,以便内存能够再次利用。
这里就需要关注——怎样确定对象不再需要使用,并且其占用的内存可以被收回。
在Xcode4.2发布之前,oc内存管理全靠程序员自己,即手工管理内存计数。
在Xcode4.2版本之后,支持自动引用计数(Automatic Reference Counting,ARC),即摆脱手工管理,程序员从烦恼的内存管理问题中彻底解脱,oyeah~~
但是,为了理解过去遗留的代码,还是需要了解手工管理内存的原理。并且,也可以帮助coder们更明智地决定使用内存。
这里,推荐开启ARC功能(在build setting中)。
Apple支持的两种基本oc内存管理模式:
何为引用计数?
每个对象都有一个与之关联的整数,被称作对象的引用计数(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消息。
有两种方法创建一个自动释放池:
@autoreleasepool { //statement } NSAutoreleasePool *pool; pool = [NSAutoreleasePool new]; //或者pool = [[NSAutoreleasePool alloc] init]; //... //[obj autorelease]; //... [pool release];
==========================================================
*************Cocoa手工内存管理规则*********
详细介绍见 http://www.cnblogs.com/melody5417-bky/p/4314443.html
============================================================
标签:
原文地址:http://www.cnblogs.com/melody5417-bky/p/4319111.html