iphone桌面单元保留/释放
这段代码不会在对单元格执行任何操作之前自动释放它吗?据我所知,细胞本身没有保留,当细胞返回时,自动释放可能会启动,不是吗iphone桌面单元保留/释放,iphone,memory-management,uitableview,Iphone,Memory Management,Uitableview,这段代码不会在对单元格执行任何操作之前自动释放它吗?据我所知,细胞本身没有保留,当细胞返回时,自动释放可能会启动,不是吗 这两种方法似乎都有效,我只是想完全理解它为什么有效。值得您进一步了解iPhone内存管理 基本上,[alloc]和[copy]都会将您的保留计数增加1。因此,下面这句话: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell ==
这两种方法似乎都有效,我只是想完全理解它为什么有效。值得您进一步了解iPhone内存管理 基本上,[alloc]和[copy]都会将您的保留计数增加1。因此,下面这句话:
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
...
return cell;
将新单元格对象的保留计数从零增加到一
然后,您可以通过键入以下内容,手动将保留计数减少回零:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
而不是自动释放。这将使其保留计数减少到零,此时iPhone系统将自动释放此对象的内存。[请注意,您从不直接调用[cell dealloc]——而是在retain计数返回零时自动执行dealloc。]
但是,您不容易知道何时不再需要该单元格。因此,您使用[自动释放]
在不深入了解autorelease工作原理的情况下,它可以有效地收集所有不再被引用的对象,并在下一个运行周期开始时释放它们(从而解除对它们的分配)
只要有对单元格对象的引用,它就不会自动删除。当您没有引用它时,它将被添加到自动释放池中,并将在适当的时候释放
抱歉,这有点牵扯其中-这有帮助吗 自动释放在
NSAutoreleasePool
耗尽之前不会“启动”,方法返回时不会执行此操作。除非手动创建一个NSAutoreleasePool
,否则在事件循环期间将排空该池。只要在返回到事件循环之前将表单元格添加到UITableView(保留它),单元格就会一直保留。当返回单元格时,您遵循的标准约定是,由方法创建的对象将自动删除,如果某个对象关心,则需要保留它们
在本例中,“something”是UITableView向您请求一个单元格。当此方法返回单元格时,调用该单元格的代码将保留该单元格并将其保留,直到释放表视图为止
那么,为什么自动释放不导致它在返回之前释放呢?因为在Objective-C中发生的一切都在所谓的“运行循环”中,也就是说,它是一个反复运行的循环。在表视图完成调用后,它返回,然后告诉表视图更新的内容返回,依此类推,直到到达顶部runloop——此时执行自动删除,单元格保留计数下降1。不过,这也没关系,因为UITableView保留了它。不对!!自动释放意味着稍后计数将返回到零。。。你自己打电话[手机释放]会导致稍后的崩溃。是的,我也知道这一点。我知道引用计数jsut不确定UITableViewCell的工作方式。在我可以将对象保留在调用代码中之前,我已经发布了对象,尽管这可能是由gdb造成的。肯德尔你投票太匆忙了。。。我的全文都说,虽然您可以手动释放它,但您已经(正确地)将它设置为自动释放。很明显,如果您在使用[autorelease]后实际调用[cell release],它将崩溃!感叹希望人们在投票前阅读…布伦登,你的问题是“据我所知,细胞本身没有保留”,这就是我正在纠正的。。。[alloc]语句将保留计数增加1。h4xxr,我知道该单元格有一个保留,但它将自动释放。我的灰色区域就是这种情况发生的时候。我想在它返回后,游泳池会被排干。我不熟悉自动游泳池何时被排干。
[cell release];