有“创建”,就要有“销毁” 针对创建和销毁过程进行管理
管理方式:垃圾回收 (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的