2009-08-11 98 views
1
UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:CellIdentifier] autorelease]; 
... 
return cell; 

这个代码是否会在使用它之前自动释放单元格?据我所知,单元本身没有保留,当ell返回时,autorelease可能会启动,不是吗?iphone表格单元格保留/发布

它似乎可以工作,我只想完全理解它为什么。

回答

2

直到NSAutoreleasePool排空,自动释放不会“踢入”,这在方法返回时不会完成。除非手动创建NSAutoreleasePool,否则在事件循环期间池会被耗尽。只要您在返回到事件循环之前将表格单元格添加到UITableView(保留它),单元格就会停留。

-1

它是值得你更多地处理iPhone内存管理。

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

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

递增您的新单元格对象,从零到一个保留计数。

可以然后手动降低保留计数回零,当你用它做,通过键入以下内容:自动释放的

[cell release]; 

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

但是,你不容易知道什么时候会不再需要该单元格。所以你可以使用[autorelease]。

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

只要你有一个单元对象的引用,它就不会被自动释放。当你没有引用它时,它会被添加到autorelease池中,并在适当的时候被释放。

对不起,这有点涉及 - 这是否有帮助??!

+0

不正确!自动释放意味着稍后将其计数归零......自己调用[单元格释放]将在稍后导致崩溃。 – 2009-08-11 22:57:03

+0

雅我也已经知道了。我明白引用计数jsut不确定UITableViewCell的工作方式。我已经释放了对象,然后才能将它们保留在调用代码中,尽管这可能是由gdb引起的。 – Brenden 2009-08-11 23:21:50

+0

Kendall你太急躁了...我的整个文本说,虽然你*可以*手动发布它,你已经改为(正确)将其设置为autorelease。很明显,如果你真的调用[cell release]也使用[autorelease],它会崩溃! *叹息*希望人们会在downvoting之前阅读... – h4xxr 2009-08-11 23:37:11

1

当您返回一个单元格时,您遵循的标准惯例是由方法创建的对象是自动释放的,并且如果某件事关心它需要保留的对象。

在这种情况下,那个“something”是UITableView询问你的单元格。当这个方法返回单元格时,调用你的代码会保留它并保留它,直到表视图被释放。

那么为什么autorelease在返回之前不会释放它?因为在Objective-C中发生的所有事情都在所谓的“RunLoop”中,这意味着 - 它是一个一次又一次运行的循环。在表视图完成调用之后,它返回,然后告诉表视图更新返回,等等,直到达到顶层runloop - 此时执行autoreleases并且单元格保持计数下降1。但是,再次好,因为UITableView保留了它。