简介
程序内存管理是在程序运行期间分配,使用和释放内存的过程。不好的内存管理,程序就会出现很多内存泄露,从而影响程序的效率和质量,甚至导致程序crash。所以深入学习和理解内存管理机制,对每个程序员(至少mac/ios 程序员)来说都很重要。
Object-C的内存管理采用retain-release,autorelease机制。每个object都有一个计数器(ref count),当retain一个object时,该object的计数器就会自动加1,表示有地方在使用该object。当release一个object时,该object的计数器自动减1。当计数器为0时,该object会从内存中释放掉。
[object retain] ---// count +1;
[object release] ---// count -1(注意:不是真正的释放,当ref count==0时,才会释放掉);
703347a3habf370119d75&690.png 使用内存管理
1. 在存取方法中使用
//------------------------
- (NSString *)name
{
return name;
}
- (void)setName:(NSString*)aName
{
[name release]; //release old
name = [aName retain]; //assign new
}
//-----------------------
- (void)dealloc
{
[name release];
[super dealloc];
}
现在大多使用@property (nonatomic, retain)NSString *name;这个等价于上面的两个方法。
2. 避免正在使用的object被dealloc
a.从集合类(NSArray)中移除一个对象
objectA = [array objectAtIndex:i];
[array removeObjectAtIndex:i];
//objectA 现在不可用。
-----> 从NSArray中移除一个对象,会发送一个release消息给该对象[objectA release](而不是autorelease)。
b.当一个parent object被释放
objectA = [parent child];
[parent release]; // 或者 self.parent = nil;
//objectA 现在不可用。
-----> [parent release] 会调用parent的dealloc方法,在parent的dealloc方法中 child会被release。所以[parent release]后 objectA也会被release,变为不可用。
为了保护objectA,可以reain一次该objectA:
objectA = [[array objectAtIndex:i] retain];
[array removeObjectAtIndex:i];
//objectA 可用
[objectA release];
3.自动释放(autorelease)
当autorelease一个object时,该object会被放入自动释放池(NSAutoreleasePool)中。NSAutoreleasePool会帮你release。
三种情况可能会用到NSAutoreleasePool:
a.当你的程序不是基于UI framework,例如 command-line tool。
b.当你写一个loop,里面生成很多临时的object时,可能需要create 一个自动释放池。
c.当开启另外的线程时,需要一个自动释放池来帮助减少内存的占用。
4.垃圾回收(garbage collection system)
目前很少用,后续可能会使用该机制。--->系统帮我们来管理,不用手动的release。
另外:内存管理可能比较复杂,这里只做个大概的介绍,希望大家多多研究理解,让程序更加的健壮