(Retain/Release) Memory Management(获取/释放
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
这是Objective-C中最常用的内存管理方法。
- 当一个对象创建时,它的引用计数(
retain count
)是1, - 当一个对象被
retained
,它的引用计数(retain count)+1, - 当一个对象被
release
,它的引用计数(retain count)-1, - 当对象的引用计数(retain count)是0的时候,这个对象被dealloc掉(系统自动发dealloc消息给对象)。代码如下:
Coin *c = [[Coin alloc] initWithValue: 10]; //引用计数(retain count)是1
[c retain]; // 调用retain方法 (retain count 现在是 2)
[c release]; // 调用release方法 (retain count 现在是1)
[c release]; // 调用release方法 (retain count 变为0) 然后调用 dealloc回收c
将对象的引用计数(retain count)设置为1的方式有调用alloc
、new
、copy
这三个方法。
而且在编程中,有一些约定俗成的原则,他们是:
- 如果一段代码中alloc了一个对象,那么这个这段代码就拥有这个对象,必须有责任去release这个对象。
- 如果一段代码仅仅是接收了一个从其他地方传递过来的对象,则不必负责去release这个对象。
- 在一段代码中,对一个对象retain的次数一定要和release对象的次数相等。
因此,一个典型的用法是:
NSString *msg = [[NSString alloc] initWithString: @"Test message."];
NSLog(msg);
// 我们alloc了msg所以由我们来 release 它
[msg release];
Retain
和release
也必须用于是对象的实例变量(属性),如下:
- (void)setFoo:(FooClass *newFoo)
{
//首先,retain newFoo
[newFoo retain];
// 现在,release掉foo对象,因为可能newFoo == foo
[foo release];
//最后,将newFoo赋值给foo,原来的foo被release,如果retain count为0,则老foo被收回
foo = newFoo;
}
因为有了retain/release
的方法来管理内存,现在我们可以在一个类的里面很安全的使用存取器(getter/setter
)来设置实例变量了。代码如下:
- (void)resetFoo
{
FooClass *foo = [[FooClass alloc] init];
[self setFoo: foo];
//因为setFoo方法中已经retain过,所以让我们release由我们alloc出来的foo
[foo release];
}
在线练习
{$ activeFileHint $}