了解保留和释放以外的方法的保留计数的影响

时间:2011-11-22 14:14:01

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

我有一个例程来正确分配和释放我的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获取了记录内存使用情况的代码。

3 个答案:

答案 0 :(得分:2)

你正在做这样的事吗?

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

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

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

答案 1 :(得分:1)

在致电removeFromSuperview后,您无需致电bringSubviewToFront:。只需要您释放您保留的内容。如果要从视图层次结构中删除视图,则会调用removeFromSuperview。它也称release无关紧要。

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

答案 2 :(得分:1)

我假设,在您的代码的某处,您正在使用类似的东西将该对象添加到视图中:

[self.view addSubview:myObject];

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

[myObject removeFromSuperView];

为你释放魔法......