0

我有太多次发布视图的问题。虽然理论上很简单,因为我将 uiview 移动到 uiview,它是 uiview 的一个子类并且被动画等等它不是我可以轻易修复的东西。它只会在某些条件下崩溃 10%,即使在这些条件下也只有 30% 的时间。

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

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

通常会调用与发布的崩溃一致的方法,但并非总是如此,而且当我有时期望它崩溃时,它几乎会发生。我已经用这段代码检查了泄漏,它永远不会泄漏。

现在的实际问题......由于保留计数而释放某些东西是错误的吗?我已经尝试了许多不同的方法来解决这个问题,到目前为止,这是唯一可靠且不泄漏的方法。

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

mainView = newView;
[newView release];

我试过先释放 mainView 然后在 newView 上调用 copy 但这会崩溃。上面的方法也很完美,除了保留计数有时比预期的低 1,即使它从未在代码中的其他任何地方发布。

4

3 回答 3

5

不要使用 retainCount 值。

说真的,你永远不应该将该值用于像这样真正有用的任何东西。

如果您有内存泄漏,或者由于过度释放而导致崩溃,请修复它们 - 它们是错误!这不是处理它们的方法。

编辑:总是一本好书:内存管理指南

于 2010-10-12T07:08:41.753 回答
1

不要使用 -retainCount。

对象的绝对保留计数是没有意义的。

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

有关完整的详细信息,请参阅内存管理指南


在这种特定情况下,release当你没有保留一个对象时,它是一个灾难的秘诀。如果它现在不崩溃,它总有一天会崩溃,可能是由于软件更新或看似无关的更改。它可能只是现在才起作用,因为您的内存管理在其他任何地方都是错误的。

如前所述,这:

mainView = newView;
[newView release];

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

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

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

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

于 2010-10-31T18:37:28.133 回答
0
mainView = newView;

它不是一个副本,而是一个任务。retainCount 不会增加。然后你就不必发布了。

于 2010-10-12T07:22:47.357 回答