【发布时间】:2012-01-22 21:32:14
【问题描述】:
据我了解,当向对象发送autorelease 消息时,如果除main.m 中的自动释放池之外不存在自动释放池,则该对象将被放置在main.m 中的自动释放池中。假设这是正确的,我有几个问题:
1) 所有自动释放的对象是否都保留在该池中,直到应用程序终止?
2) 如果 1 为真,在没有本地自动释放池的情况下创建自动释放对象(因此将该对象放入 main.m 池中)是否会将该对象保留在内存中,直到应用程序终止或收到内存警告?
3) main.m 自动释放池何时耗尽,除了应用收到内存警告或应用终止时?
例如,在像这样的 cellForRowAtIndexPath 委托方法中:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"];
if (cell == nil) {
// No cell to reuse => create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Foobar"] autorelease];
// lots of custom stuff
}
return cell;
细胞何时真正释放?它们必须自动释放,因为您不能在返回它们之前释放它们,并且您不能在之后释放它们,因为它们超出了范围。根据我目前的理解,细胞被放置在最顶层的自动释放池中,并在该池耗尽/释放时释放。在这种情况下,这将是应用程序中唯一的自动释放池; main 中的那个。
4) 问题在于,即使我完成了这些单元格并且视图控制器已被释放,这些单元格仍保留在内存中,是吗?如果不是这种情况,有人可以解释这种情况下的内存管理是如何工作的吗?谢谢!
注意:我查看了 Apple 的文档,但它主要讨论了何时使用您自己的本地自动释放池,而不是关于它们的实际功能。
【问题讨论】:
标签: objective-c ios memory-management autorelease nsautoreleasepool