Objective-C内存管理

总结表格:

获得方式 临时变量 成员变量
通过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]

By Lu Jun

80后男,就职于软件行业。习于F*** GFW。人生48%时间陪同电子设备和互联网,美剧迷,高清视频狂热者,游戏菜鸟,长期谷粉,临时果粉,略知摄影。

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.