FLYBLOG » 文章 » iPhone开发之Objective-C学习(4)

iPhone开发之Objective-C学习(4)


Objective-C的内存管理

在Mac OSX 系列操作系统以及iPhone平台上写应用程序时,打开垃圾回收选项,如果程序并不涉及复杂的内存分配, 就几乎可以不用操心内存管理的问题。系统会自动释放部分不用的内存,就像Java那样。 但是如果所编写的程序中有大量内存分配以及频繁释放使用, 这时就需要自己来管理内存。 也就是说,如果你使用alloc方法为对象分配空间, 就应该在使用完后手动发送release消息以释放内存空间。autorelease自动释放类型无需手动发送release消息,否则会使程序崩溃, 系统会退出在autorelease对象作用域时自动释放相应内存空间。如下面的代码中,

1
2
3
4
5
6
7
//自动释放类型的对象, 系统会自动释放其内存空间
NSString* str1 = [NSString string];
 
NSString* str2 = [[NSString alloc] init];
//.. 使用 str2
// 在不使用时发送release消息释放内存空间
[str2 release];

Objective-C的内存管理体系引入一种叫引用计数的概念来管理内存,类似C++ COM对象中的引用计数器,当计数器减小到0 时释放内存空间。 简单来说, 在使用alloc创建对象是引用计数为1, 使用retain一次计数加1, 发送release计数减1,如

1
2
3
4
5
NSString* string = [[NSString alloc] init];//计数为1
[string retain];// 计数为2
//....
[string release];
[string release];// 需要发送release消息两次才能释放内存空间

这里有一张来自http://cocoadevcentral.com 的图很生动的解释了这一原理

内存分配与释放

在平时编写程序是无需去在意引用计数, 只要记住一般情况下只有两种情况下才需要显式发送release消息释放空间
1. 保留变量实例,以供后续使用
2. 函数内创建的临时对象

最后, 记住每使用一次alloc就需要发送release或autorelease消息一次, 每调用一次retain也同样需要release, 只要alloc或者retain 和release或者autorelease成对出现就不会存在内存泄露的可能。

待续…


原创文章如转载,请注明
转载自:FLYBLOG [http://www.flyblog.info]

本文链接地址:http://www.flyblog.info/catprogramming/163.html

标签:    
分类: 编程开发  | 评论: (0)  |  浏览:( 139 )


名称[Name](*):
邮箱[Email](*):
网站链接[Website]:
正文[Message](*):