如何引用自动释放池中的对象?

时间:2009-04-28 11:10:12

标签: iphone cocoa-touch memory-management autorelease

我想知道自动释放池是否包含对它所拥有的对象的强或弱引用。我猜它们很弱。当我将一个对象添加到自动释放池时,它不会立即释放,但会在池耗尽时释放,对吧?所以引用应该是弱的,即当我将对象添加到自动释放池时,引用计数(或保留计数)保持不变?

4 个答案:

答案 0 :(得分:6)

在垃圾收集内存管理环境(即使引用时自动释放和清除弱指针)的上下文中,谈论强引用和弱引用也是有意义的。启用GC后,所有retain / release / autorelease调用基本上都不执行任何操作(尽管NSAutoreleasePool -drain方法会触发垃圾回收)。

既然你已经将这个问题标记为iPhone相关,并且iPhone上没有垃圾收集,我假设你指的是常规引用计数,强你的意思是增加引用对象的保留计数,并且弱者意味着只存储指针值。

autorelease方法实质上将对象的所有权从调用代码移动到当前自动释放池,您可以想到调用代码调用版本和池调用保留。

因此,引用实际上很强大,但您的代码失去了所有权并释放了责任。在释放/排空自动释放池时将调用对象release

答案 1 :(得分:2)

自动释放池的重点是它是延迟释放。例如,您可以在方法中返回的本地对象上调用autorelease,以便即使在方法返回时丢失对对象的引用也会释放它。

答案 2 :(得分:1)

是。保留计数保持不变,你可以检查它是这样的:

id obj = [[NSObject alloc]init];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
    [obj autorelease];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);

答案 3 :(得分:0)

保留计数保持不变,基本上在对象上触发自动释放消息使开发人员免于拥有所有权和发布责任。

这就是自动释放池的工作原理 - 每次创建自动释放池的实例时,它都会添加到堆栈顶部,因此系统将使用最新的自动释放池。每当您在自动释放池中添加任何对象时,它都会添加到堆栈中的顶级自动释放池中。自动释放池基本上是一个添加了自动释放对象的数组。在释放(/耗尽)特定自动释放池时,将释放在自动释放池中添加的每个对象。在系统开始处理任何事件之前首先创建自动释放池,它将保持在那里直到当前事件循环的执行结束。当系统看到当前事件循环完成后,它会获得与该事件循环关联的最顶层自动释放池并将其释放。释放自动释放池/耗尽意味着在自动释放池中添加每个对象并在对象上触发释放消息,直到释放自动释放池中的所有对象。