您的位置:首页 > 其它

Memory Management in Cocoa Program

2013-03-05 20:17 387 查看
内存管理模型基于对象的引用计数。一个对象至少有一个拥有者。如果一个对象没有拥有者,运行时系统会自动destroy它。为了保证正确清除掉拥有的调用,Cocoa设定了以下的基本准则。

基本准则:

创建一个对象,你就持有了它。(创建一个对象的方法往往是已“alloc”,“new”,“copy”或者“mutableCopy”为前序)

可以通过retain去持有一个对象

当不再需要对象时,就要清除掉持有对象的引用(通过发送release或者autorelease消息)

不持有的对象不需要清除掉引用(例如[NSString stringWithFormat:""]的对象就是你没有持有的对象,不需要release)

Autorelease

autorelease的作用是延迟发送一个release消息。发送的时间是当前autorelease pool block的最后。

通过引用返回的对象

在Cocoa中,一些方法是通过引用返回的对象,这种对对象是没有持有的,不需要release。例如:NSError

View Code

– (id)findMatchingObject:(id)anObject {
id match;
while (match == nil) {
@autoreleasepool {
/* Do a search that creates a lot of temporary objects. */
match = [self expensiveSearchForObject:anObject];
if (match != nil) {
[match retain]; /* Keep match around. */
}
}
}
return [match autorelease]; /* Let match go and return it. */
}


autorelease pool block和线程

Cocoa应用中的每一个线程都会维护有自己的autorelease pool block栈。如果你需要写一个仅仅以来Foundation的程序或者分配一个新线程,你就需要创建自己的autorelease pool block。

如果你的应用或者线程是长时间运行并产生大量autorelease对象的,你就需要创建autorelease pool block。否则,autoreleased 对象就会堆积,内存空间就会不断上升。如果你的分配的线程不需要调用Cocoa的东西,就不需要使用autorelease pool block。

注意:如果创建的另外一个线程使用的是POSIX 线程API而不是NSThread,你不能使用Cocoa,除非Cocoa是多线程模式的。Cocoa只有在另外创建了第一条NSThread线程后,才会进入多线程模式。所以如果要在POSIX线程中使用Cocoa,就需要应用先额外至少创建一条NSThread,这个NSThread可以立刻退出。可以用NSThread的isMutiThread方法测试一下Cocoa是否在多线程模式下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: