对象的声明周期
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,那么使用该关键字