首先还是来一句OC中的内存管理的黄金法则比较好
如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。(黄金法则就应该有金黄色的背景来衬托)
Objective-C的内存管理机制是比较灵活的,即可以完全的手动进行内存的管理,也可以用AutoreleasePool让它升级为半自动化的内存管理模式
1、cocoa中的内存管理机制——引用计数
引用计数(reference counting)又称为保留计数(retain counting),引用计数的数值表示有几个其它对象在使用它。
每一个对象都拥有一个引用计数
当对象被创建的时候,引用计数的值为1
当发送retain消息的时候,该对象的引用计数加1,该对象的引用计数为2
当这个对象发送release消息的时候,该对象的引用计数减1
当一个对象的引用计数为0时,系统自动调用dealloc方法,销毁该对象。
Dog *dog = [[Dog alloc]init];//此时引用计数为1 NSLog(@" %d",[dog retainCount]); [dog retain];//引用计数变成2 [dog release];//引用计数变成1 [dog release];//引用计数变成0,系统会自动调用dealloc方法,销毁对象,回收内存
引用计数是实例对象的内存回收唯一参考
引用计数(retainCount)是Objective-C管理对象引用的唯一依据。调用实例的release方法后,此属性减一,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永不该手动调用对象的dealloc方法。
关于dealloc方法
它的作用是,当对象的引用计数为0时,系统会自动调用dealloc方法,回收内存,它的一般写法为:
-(void)dealloc -(void)dealloc
{ {
[super dealloc]; [person release];
} [super dealloc];
}
在这里为什么要调用父类的dealloc方法呢
子类的某些实例是继承自父类的,因此,我们需要调用父类的dealloc方法,来释放父类拥有的这些对象。
一般来说调用的顺序是,当子类的对象释放完时,然后再释放父类的所拥有的实例,这一点与调用初始化方法,正好相反。
2、对象所有权当一个所有者(可以是任何一个OC对象)做了以下某个动作的时候,它就拥有了对一个对象的所有权。
(1)如果创建或者复制某个对象时,则拥有了该对象的所有权,即包含下列关键词时:
alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:
(2)如果没有创建或复制对象,而是保留引用,同样拥有该对象的使用权
retain
(3)当拥有了某个对象的所有权,在不需要某一个对象时,需要释放他们,用
release,autoRelease
3、自动释放池的相关用法
(1)cocoa中的自动释放池(Autorelease pool),是能够自动释放赤忠的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。如果要向使用使用自动释放池释放对象,我们首先要有一个入池操作:
//创建自动释放池 @autoreleasepool { //入池对象5.0之后的写法 }
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; //入池对象5.0之前写法 [pool release];
自动释放池是以栈的形式实现的,当某个对象调用了autorelease方法时,该对象会被加入自动释放池的栈顶。对于发送了autorelease消息的对象,当自动释放池销毁时,自动释放池会对这些对象发送一条release消息,来释放他们。
(2)向自动释放池发送release及drain消息的区别
当我们向自动释放池pool发送release消息时,它会向池中的每一个发送了autorelease消息的对象发送一条release消息,并且自身也会销毁。当向它发送drain消息时,只会释放里面吧的对象,而不会销毁自己。
4、关于ARC(Auto reference counting)自动引用计数
当你在编译程序的时候提供自动管理内存的功能,它会自动加入内存的控制代码,控制对象的生命周期,大大简化了内存管理的步骤,ARC管理内容的原理就是,编译器会在适当的地方自动插入retain、release和autorelease消息,但是注意版本,是在ios4及以上(不是很确定)。要使用此方法,可以在Xcode中创建项目时勾选,如图
如图:
在新建MAC的命令行程序时:
当在创建IOS工程时:
5、垃圾回收机制
类似与java中的垃圾回收机制,Objective-c在2.0以后也提供了垃圾回收机制,但是在IOS 中并不支持。但是我们要明白的是垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存