Oc内存管理
2014-03-25 11:57
141 查看
对象的声明周期
a 对象的初始化(alloc new copy)
b 对象接收消息和执行操作
c 对象被释放
引用计数
a 当对象刚被创建时,初始值为1
b 访问对象时,计数器加1(通过retain来实现)
c 结束访问时,计数器减1 (通过release来实现)
d 结束访问时,如采用autorelease方式,在当前自动释放池结尾会将该对象的引用计数器减1
e 当对象计数器为0时,其他代码不再访问该对象,销毁,回收内存
eg:- (void) setEngine: (Engine *) newEngine{
if (engine !=
newEngine) {
[engine release];
engine = [newEngine
retain];
}
}
对象的所有权:(拥有一个对象)
•某个对象一旦拥有另外一个对象,那么这个对象要确保对其拥有的另外一个对象进行清理
• 一个对象有其他对象类型的实例变量称为拥有这些对象
一个函数中创建了一个对象的局部变量,则称这个函数拥有这个对象
有可能多个对象同时都拥有一个特定的对象,这种所有权更加复杂
内存管理基本原则: 谁创建,谁释放
ARC在编译期间为每个对象添加合适的retain、 release、autorelease等方法,保证每个变量的生成周期控制在合理的范围内,达到和手动管理内存同样的效果
•使用ARC时不用关心临时变量的释放
•__strong
–变量声明缺省都带有__strong,对象持有者
•__weak
–不是对象持有者,然后对象销毁时被置为nil
•__unsafe __unretained
–类似__weak,但是对象销毁时不被置为nil
•__autoreleasing
–即当希望方法返回时对象被autoreleased,那么使用该关键字
a 对象的初始化(alloc new copy)
b 对象接收消息和执行操作
c 对象被释放
引用计数
a 当对象刚被创建时,初始值为1
b 访问对象时,计数器加1(通过retain来实现)
c 结束访问时,计数器减1 (通过release来实现)
d 结束访问时,如采用autorelease方式,在当前自动释放池结尾会将该对象的引用计数器减1
e 当对象计数器为0时,其他代码不再访问该对象,销毁,回收内存
eg:- (void) setEngine: (Engine *) newEngine{
if (engine !=
newEngine) {
[engine release];
engine = [newEngine
retain];
}
}
对象的所有权:(拥有一个对象)
•某个对象一旦拥有另外一个对象,那么这个对象要确保对其拥有的另外一个对象进行清理
• 一个对象有其他对象类型的实例变量称为拥有这些对象
一个函数中创建了一个对象的局部变量,则称这个函数拥有这个对象
有可能多个对象同时都拥有一个特定的对象,这种所有权更加复杂
内存管理基本原则: 谁创建,谁释放
ARC在编译期间为每个对象添加合适的retain、 release、autorelease等方法,保证每个变量的生成周期控制在合理的范围内,达到和手动管理内存同样的效果
•使用ARC时不用关心临时变量的释放
•__strong
–变量声明缺省都带有__strong,对象持有者
•__weak
–不是对象持有者,然后对象销毁时被置为nil
•__unsafe __unretained
–类似__weak,但是对象销毁时不被置为nil
•__autoreleasing
–即当希望方法返回时对象被autoreleased,那么使用该关键字
相关文章推荐
- android之性能优化
- Thread和Service应用场合的区别
- android AlertDialog自定义布局文件
- 专题1.1――Exchange2013部署前准备条件
- 安装setuptools
- 黑马程序员之笔记5---包
- 诊断与调优工具
- Context 与 getApplicationContext 应该在什么时候用
- android videoview播放视频
- PHP程序输出日历
- 你想要的,要你自己给自己
- java 时间的操作
- 软件测试方法小汇总
- vs2010源代码管理里找不到vss的问题
- Android中的JSON解析方式:json; Gson ; Fastjson
- 2014_03_25
- extjs form 取值 赋值 重置 1
- HDU 2795 Billboard(线段树:找到线段树中>=给定值的第一个元素位置 并 更新该点)
- 世界上超难找的药方
- MapReduce优化----优化方案着手点