【问题标题】:Understanding the effects on retain count of methods other than retain and release了解保留和释放以外的方法对保留计数的影响
【发布时间】:2012-01-03 22:04:54
【问题描述】:

我有一个例程来正确分配和取消分配我的 UIView 子类,但是当我在该类的 - (void) dealloc 中设置断点时,我发现它没有被调用并且我有一个巨大的内存泄漏。

所以我在发布之前打印了retainCount,它是2(这可能是正常的,因为其他对象可以使用它)。我搜索并没有看到任何其他retain 消息。然后我发送:

[myObject removeFromSuperview];

现在它被释放了。这让我意识到我之前发送了:

[self.view bringSubviewToFront:myObject];

很难知道当我使用bringSubviewToFront: 时,我总是必须调用removeFromSuperview。是否存在其他类似的方法可以增加保留计数?

如果这个对象不是一个子类,而只是一个UIView,我永远不会知道我造成了内存泄漏。

那么,我怎样才能真正知道我的对象已经被释放并且内存是空闲的呢?

知道发生了什么对我来说并不重要,但我想知道我正在创建和删除对象。这是一个演示,带有和不带有removeFromSuperview 的相同代码会导致我看到的效果——这是我的日志。

当我使用removeFromSuperview时,

Memory used 16687.1 ( +5378), free 262213.6 kb
Memory used 19451.9 ( +2765), free 257159.2 kb
Memory used 19451.9 (    +0), free 259530.8 kb 
Memory used 21844.0 ( +2392), free 257830.9 kb 
Memory used 24313.9 ( +2470), free 256356.4 kb 
Memory used 25260.0 (  +946), free 253141.0 kb
Memory used 27848.7 ( +2589), free 252874.8 kb
Memory used 30142.5 ( +2294), free 250814.5 kb
Memory used 30814.2 (  +672), free 247787.5 kb

你可以看到内存使用量只会增加,但是当我确实使用它时:

Memory used 16105.5 ( +4829), free 262619.1 kb
Memory used 16527.4 (  +422), free 262815.8 kb
Memory used 14168.1 ( -2359), free 262832.1 kb
Memory used 16769.0 ( +2601), free 263266.3 kb
Memory used 16560.1 (  -209), free 264785.9 kb 
Memory used 14200.8 ( -2359), free 264794.1 kb 
Memory used 16789.5 ( +2589), free 264290.3 kb 
Memory used 16597.0 (  -193), free 264499.2 kb 
Memory used 14237.7 ( -2359), free 264515.6 kb 
Memory used 16609.3 ( +2372), free 264290.3 kb 
Memory used 16560.1 (   -49), free 264425.5 kb 
Memory used 14200.8 ( -2359), free 264441.8 kb 

现在内存随我的意愿增加和减少。

我从https://stackoverflow.com/q/7990532/632472 获得了记录内存使用情况的代码。

【问题讨论】:

  • 大声笑..我的英语语法有一些问题:(

标签: objective-c cocoa-touch memory-management memory-leaks


【解决方案1】:

我假设,在您的代码的某个地方,您正在将该对象添加到视图中,如下所示:

[self.view addSubview:myObject];

如果是这样,那就是额外保留的重点,因为任何 UIView 都会保留其内容。实际调用

[myObject removeFromSuperView];

释放魔法为你...

【讨论】:

    【解决方案2】:

    你在做这样的事情吗?

    self.subView = [[UIView alloc] init];
    

    如果是这样,那可能是您的问题。保留计数将为 2。一次用于分配,一次用于属性集。您可能需要考虑添加对 autorelease 的调用

    self.subView = [[[UIView alloc] init] autorelease];
    

    【讨论】:

      【解决方案3】:

      没有要求您在调用bringSubviewToFront: 之后再调用removeFromSuperview。只要求您释放您保留的内容。 removeFromSuperview 当您想从视图层次结构中删除视图时调用。它也调用release 是无关紧要的。

      这里你更有可能有一些其他的过度保留myObject。您是否总是为您的 ivars 使用访问器?对 ivars 的直接访问(除了在 init 和 dealloc 中)是内存泄漏的最常见原因。如果 myObject 没有存储在 ivar 中,则运行分析器以确保您没有在更明显的地方过度保留 myObject。 (分析器在理解 ivars 方面不好,但使用访问器通常可以解决这些问题。)

      【讨论】:

      • 我编辑了帖子并放了一些数据。因为我看到了这个,所以我得出结论我必须打电话给removeFromSuperView
      • 我并不是说你没有泄漏。我是说 removeFromSuperview 可能掩盖了泄漏。您的泄漏更有可能发生在其他地方。 @dar512 有一个很好的可能泄漏的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2019-10-07
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多