本帖最后由 bao9107 于 2014-3-26 09:23 编辑
OC的内存管理小结
一、内存管理的原因:
OC和Java的一个不同之处在于OC没有垃圾回收机制,所以就要求程序员手动将不再使用的对象释放,否则会照成内存泄露。只有OC对象才需要释放,C语言基本数据类型不需要释放。
二、内存管理的原则:
1、每一个OC对象都有一个引用计数器retainCount,表示对象被引用次数。对象被创建时计数器默认为1,当计数器为0时,系统会自动调用dealloc方法销毁对象并释放内存。
2、对象的retain方法会使对象计数器加1,release会使对象计数器减1。
3、调用了alloc、new、copy、retain方法,对应的在代码末尾调用一次release。
也就是说调用了alloc、new、copy创建对象,就需要release。谁retain,谁release。
如:- Dog *dog = [[Dog alloc]init];//此时引用计数为1
- NSLog(@" %d",[dog retainCount]);
- [dog retain];//引用计数变成2
- [dog release];//引用计数变成1
- [dog release];//引用计数变成0,系统会自动调用dealloc方法,销毁对象,回收内存
复制代码
三、内存管理的黄金法则:(官方文档原文)
The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.
如果对一个对象使用了alloc、[mutable]copy、retain,那么你必须使用相应的release或者autorelease。
关于autorelease(自动释放池):
cocoa中的自动释放池(Autorelease pool),是能够自动释放次中的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。当自动释放池销毁时,自动释放池会对这些对象发送一条release消息。自动释放池并不是销毁对象,只是自动释放池内调用了autorelease消息的对象进行一次release操作。当我们向自动释放池pool发送release消息时,它会向池中的每一个发送了autorelease消息的对象发送一条release消息,并且自身也会销毁。当向它发送drain消息时,只会释放池里面的对象,而不会销毁自己。
对于dealloc方法:
主要功能是释放成员变量的所有权,释放不再使用的内存。
此方法是从NSObject继承来的,不需要在.h文件中进行声明。
此方法不能手动调用,只有当对象的引用计数器为0时才调用。
重写此方法一定要调用父类的dealloc方法来释放父类的实例,即[super dealloc]。一般来说调用的顺序是,当子类的对象释放完时,然后再释放父类的所拥有的实例。
ARC:
ARC是Xcode4以后推出的一种机制,它不同于Java的垃圾回收机制。它是在程序编译时自动将内存管理的代码添加到程序中,不需要程序员管理内存。在Xcode5取消了非ARC的选项。
如果有什么地方说错了,或者说漏了还请大家及时指出。
|