Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iphone桌面单元保留/释放_Iphone_Memory Management_Uitableview - Fatal编程技术网

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];