现在的位置: 首页 > 综合 > 正文

内存管理

2013年10月11日 ⁄ 综合 ⁄ 共 1249字 ⁄ 字号 评论关闭

有“创建”,就要有“销毁” 针对创建和销毁过程进行管理

管理方式:垃圾回收 (JAVA 、C#等) 手动管理 (Objective C、C)

管理机制:

OC采用“引用计数”(retainCount)方式管理对 象所占用的内存

1. 使用 alloc 为对象分配内存;使用 dealloc 释放对象所占用 的内存。

2. 使用 alloc、new或者copy构造对象时,对象的 retainCount为 1。

3. 调用对象的 retain 方法可以增加1 retainCount。

4. 调用对象的 release 方法可以减少1 retainCount。

5. 当对象的retainCount 为 0 时,dealloc 会自动调用,释 放对象内存;否则 分配给对象的内存将被一直占用。

6. 所有对象可以使用 retainCount
属性查看当前的计数器 值。

会影响计数器的操作:

1. alloc 创建一个对象,并将其引用计数设为 1,并拥有对象 所有权

2. copy (NSCopying)制造一个副本,并将副本的引用计数 设为 1,并拥有副本所有权

3. retain 使对象引用计数加1,并拥有对象所有权 

4. release 使对象引用计数减1,并放弃对象所有权 

5. autorelease 向autoreleasepool注册

属性声明中的内存管理原则

@property(retain,nonatomic) Student 

一个类中,如果这个类有属性声明retain或者
copy的属性,那么我们需要在这个类的dealloc
方法里面去释放这个属性。

例://···.h

       @property (copy,nonatomic) NSString * name;

       @property (retain,nonatomic) Studene * stu;

     //···.m

     -(void) dealloc

     {

          [_name release];

          _name=nil;//防止野指针

          [_stu release];

          _stu=nil;

          [super dealloc];

     }

对象分配内存,并应在使用后,立即调用 release 释放内存。(alloc、new)

凡是出现 retain alloc copy的地方,都应出现
release 与 之匹配调用。

便利构造器的内存管理

+(id) studentWithAge : (int ) age      

                  andName: (NSString *) name

{

     Student *stu = [Student alloc]  initWithAge : 1          andName:@"李四"];

     return [stu aoturelease];  //不⽴立即释放,而是交给autoreleasepool

}

Student *stu = [Student studentWithAge : 1          andName:@"李四"];

"+"修饰 方法成为类的方法,调用时使用类名调用。只能访问类的静态成员。属于静态方法。

使用便利构造器获得的对象,都(应)是 autorelease的

抱歉!评论已关闭.