2011-11-22 82 views
0

我有一个例程来正确分配和取消分配我的UIView子类,但是当我在类的- (void) dealloc中设置断点时,我看到它不被调用,I有一个巨大的内存泄漏。了解保留和释放以外的方法对保留计数的影响

所以我在发布之前打印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得到了记录内存使用情况的代码。

+0

笑..我有一些问题,英语语法:( – Rodrigo

回答

2

你在做这样的事吗?

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

如果是这样,那可能是你的问题。保留计数为2.一次为alloc,一次为属性集。您可能要考虑增加一个呼叫自动释放

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

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

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

+0

我编辑的职位,并把一些数据。因为我看到这个我得出的结论我必须调用'removeFromSuperView' – Rodrigo

+0

我并不是说你没有泄漏,我说的是removeFromSuperview可能会掩盖泄漏,你的泄漏更可能在其他地方。@ dar512有一个很好的例子泄漏。 –

1

我以为,在某个地方,在你的代码中被加入该对象的视图,类似的东西:

[self.view addSubview:myObject]; 

如果是这样,这就是因为任何UIView都会保留它的内容。其实来电

[myObject removeFromSuperView]; 

确实为你释放魔法...