代码之家  ›  专栏  ›  技术社区  ›  Rudiger

由于保留计数而释放对象

  •  0
  • Rudiger  · 技术社区  · 14 年前

    我对多次发布视图有意见。虽然理论上很简单,因为我正在将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,但结果崩溃了。上面的方法也可以很好地工作,除了retain count有时比预期低1之外,即使它从未在代码中的任何其他地方发布过。

    3 回复  |  直到 10 年前
        1
  •  5
  •   Eiko    14 年前

    不要使用retainCount值。

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

    如果您有内存泄漏,或者由于过度扩展而经历崩溃,请修复它们——它们是错误!而这不是处理它们的方式。

    编辑:总是一本好书: Memory Management Guide

        2
  •  1
  •   bbum    14 年前

    不要使用-retainCount。

    一个物体的绝对计数是没有意义的。

    你应该打电话 release 与使对象保留的次数完全相同。不少于(除非你喜欢泄密),当然也不多于(除非你喜欢撞车)。

    看到了吗 Memory Management Guidelines 详细信息。


    在这种情况下, 释放 当你没有保留一件物品时,将其丢弃是一种灾难。如果它现在不崩溃,总有一天会崩溃,可能是因为软件更新或看似无关的更改。它可能只是现在起作用,因为你的内存管理在其他地方都是错误的。

    如前所述,这:

    mainView = newView;
    [newView release];
    

    没有复制视图。更糟糕的是,它过度释放了视图(因为没有地方可以保留它)。

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

    你试过了吗 build and analyze 修复了它显示的任何错误?

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

        3
  •  0
  •   Benoît    14 年前
    mainView = newView;
    

    这不是副本,而是作业。重新计入的金额不会增加。那你就不必释放了。