A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bao9107 中级黑马   /  2014-3-19 15:26  /  2600 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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。
如:
  1. Dog *dog = [[Dog alloc]init];//此时引用计数为1
  2. NSLog(@"  %d",[dog retainCount]);
  3. [dog retain];//引用计数变成2  
  4. [dog release];//引用计数变成1
  5. [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的选项。

如果有什么地方说错了,或者说漏了还请大家及时指出。



评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1 总结得不错

查看全部评分

2 个回复

倒序浏览
很有用,请继续
回复 使用道具 举报
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马