2010-10-12 91 views
0

我有太多次释放视图的问题。虽然理论上很简单,因为我将uiview移动到uiview,uiview是uiview的一个子类,并且具有动画效果等等,但这不是我可以轻易修复的。它只在一定条件下崩溃10%,即使在这些条件下也只有30%时间崩溃。由于保留计数而释放对象

换句话说,它有点复杂。有时在我的dealloc方法中,这个UIView的保留计数已经是1(当视图被释放时它会被释放),所以不应该再次被释放。因此,我所做的是:

if ([mainView retainCount] > 1) { 
    NSLog(@"released"); 
    [mainView release]; 
} 

洽与释放通常被称为崩溃,但并不总是和它发生相当多的时候我有时会想到它崩溃。我已经检查了这个代码的泄漏,并且它永远不会泄漏。

现在的实际问题......由于其保留数量而释放某些内容是否是错误的?我尝试了很多不同的方法来解决这个问题,到目前为止,这是唯一可靠且无泄漏的方法。

编辑:如果没有那么有什么更好的方法来复制一个UIView到另一个UIView?

mainView = newView; 
[newView release]; 

我试着释放mainView,然后调用newView上的副本,但这崩溃。除了保留计数有时候比预期的低1,即使它从来没有在代码中任何其他地方释放,以上也是完美的。

回答

5

请勿使用retainCount值。

说真的,你应该从来没有使用这个值的任何真正有用的这样的。

如果您有内存泄漏,或者因过度销售而遇到崩溃,请修复它们 - 它们是错误!这不是处理它们的方法。

编辑:总是很好看:Memory Management Guide

+0

更新的问题 – Rudiger 2010-10-12 07:16:21

+0

您需要展示更多代码,并告诉我们您真正想要做什么。复制视图有点模糊。 – Eiko 2010-10-12 07:20:11

+0

没有什么更多。有两个复杂的UIViews,如果我需要创建一个新的复杂视图,我创建一个本地UIView,创建UIView的内容,在它们之间生成动画getView = newView然后释放newView。 – Rudiger 2010-10-12 07:22:58

0
mainView = newView; 

它不是一个副本,但分配。 retainCount将不会增加。那么你不必做出发布。

+0

这就是我想的,这就是为什么我试图复制。但它崩溃。也这样做不会泄漏,按预期工作,通常不会有保留计数问题。 – Rudiger 2010-10-12 07:26:54

+0

您不必复制视图! – 2010-10-12 08:33:14

1

请勿使用-retainCount。

对象的绝对保留数是毫无意义的。

您应该致电release完全相同的次数导致对象被保留。没有更少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。

查看Memory Management Guidelines的全部细节。


在这种特定的情况下,荷兰国际集团release当你没有保留它的对象是一个灾难。如果它现在不会崩溃,那么有一天它可能是由于软件更新或看似无关的更改。它可能现在只能工作,因为你的内存管理在其他地方都是错的。

正如有人说,这样的:

mainView = newView; 
[newView release]; 

是不是使视图的副本。更糟糕的是,它过度释放视图(因为无处保留它)。

对视图使用copy方法不是正确的解决方案,或者至少是非常不典型的解决方案。 UI元素不会以这种方式复制。

您是否尝试过build and analyze并修复了它表示的任何错误?

leaks可能不会显示任何内容,因为可能仍然存在一个指向浮动在可访问内存中的泄漏对象的指针。