UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
...
return cell;
这个代码在用它做任何事情之前不会自动释放细胞吗?据我所知,细胞本身没有保留,当返回时,自动释放可能会启动,不是吗?
它似乎无论哪种方式都有效,我只想完全理解它为什么会这样做。
答案 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]。
如果不深入了解自动释放的工作原理,它会有效地收集所有不再引用的对象,并在下一个运行周期开始时释放它们(并因此释放它们)。
只要您有对单元格对象的引用,它就不会自动释放。在您没有引用它的那一刻,它将被添加到自动释放池中,并将在适当的时候解除分配。
对不起它有点牵扯 - 这有帮助??!