在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成对出现就不会存在内存泄露的可能。
待续…
相关文章