iphone表格单元格保留/释放

时间:2009-08-11 22:22:03

标签: iphone memory-management uitableview

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
 reuseIdentifier:CellIdentifier] autorelease];
 ...
 return cell;

这个代码在用它做任何事情之前不会自动释放细胞吗?据我所知,细胞本身没有保留,当返回时,自动释放可能会启动,不是吗?

它似乎无论哪种方式都有效,我只想完全理解它为什么会这样做。

3 个答案:

答案 0 :(得分:2)

自动释放不会在NSAutoreleasePool耗尽之前“启动”,这在方法返回时不会执行。除非您手动创建NSAutoreleasePool,否则在事件循环期间池将耗尽。只要在返回事件循环之前将表格单元格添加到UITableView(保留它),该单元格就会一直存在。

答案 1 :(得分:1)

当你返回一个单元格时,你遵循的标准约定是由方法创建的对象是自动释放的,如果某些东西关心它需要保留它们的对象。

在这种情况下,“某些东西”是UITableView,要求你提供一个单元格。当此方法返回单元格时,调用您的代码会保留它并保持它,直到释放表格视图。

那么为什么自动释放不会导致它在返回之前释放?因为在Objective-C中发生的一切都在所谓的“RunLoop”中,这意味着 - 它是一个循环,一次又一次地运行。在表视图完成调用之后它返回,然后告诉表视图更新返回的东西,依此类推,直到达到顶部runloop - 此时执行自动释放并且单元保持计数下降一。但同样,这是可以的,因为UITableView保留了它。

答案 2 :(得分:-1)

值得你更多地掌握iPhone内存管理。

基本上,[alloc]和[copy]都会使保留计数增加1。所以以下一行:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
 reuseIdentifier:CellIdentifier] autorelease];

将新单元格对象的保留计数从零增加到一。

可以然后通过输入以下内容手动将保留计数减少回零:

[cell release];

反而自动释放。这会将其保留计数减少到零,此时iPhone系统将自动为此对象释放内存。 [请注意,您永远不会直接调用[cell dealloc] - 而是当保留计数返回到零时自动发生dealloc。]

然而,您不会轻易知道何时不再需要该单元格。所以你改用[autorelease]。

如果不深入了解自动释放的工作原理,它会有效地收集所有不再引用的对象,并在下一个运行周期开始时释放它们(并因此释放它们)。

只要您有对单元格对象的引用,它就不会自动释放。在您没有引用它的那一刻,它将被添加到自动释放池中,并将在适当的时候解除分配。

对不起它有点牵扯 - 这有帮助??!