总结表格:
获得方式 | 临时变量 | 成员变量 |
通过alloc/copy/init方式获得 | 用完release | 再dealloc中release |
其他方式获得 | 啥都不用管,也不用release | 调用retain,并在dealloc中release |
这其中的原因是alloc/copy/init方式获得的对象有retainCount = 1,所以在生命周期结束时需要手动release,不管是临时变量还是成员变量。对于其他方式获得的对象,由于约定这种对象都是autorelease的。所以对于临时变量正好啥都不用做。但是成员变量啥都不做就不行了,因为出了生命周期就会autorelease了,所以额外retain一下即可。既然retain了,在成员变量所属的类的dealloc中再release。
以下是Learn Objective-C on Mac的例子:
[c light=”true” toolbar=”false”]
NSMutableArray *array;
array = [[NSMutableArray alloc] init]; // count: 1
// use the array
[array release]; // count: 0
NSMutableArray *array;
[/c]
[c light=”true” toolbar=”false”]
array = [NSMutabelArray arrayWithCapacity: 17];
// count: 1, autoreleased
// use the array
[/c]
—————————————————————–
[c light=”true” toolbar=”false”]
NSColor *color;
color = [NSColor blueColor];
// use the color
[/c]
对于成员变量:
[c light=”true” toolbar=”false”]
– (void) doStuff
{
// flonkArray is an instance variable
flonkArray = [NSMutableArray new]; // count: 1
} // doStuff
– (void) dealloc
{
[flonkArray release]; // count: 0
[super dealloc];
} // dealloc
[/c]
——————————————————————–
[c light=”true” toolbar=”false”]
– (void) doStuff
{
// flonkArray is an instance variable
flonkArray
= [NSMutableArray arrayWithCapacity: 17];
// count: 1, autoreleased
[flonkArray retain]; // count: 2, 1 autorelease
} // doStuff
– (void) dealloc
{
[flonkArray release]; // count: 0
[super dealloc];
} // dealloc
[/c]