【问题标题】:Invisible memory leaks... iOS 4隐形内存泄漏... iOS 4
【发布时间】:2011-12-10 09:54:16
【问题描述】:

所以我的内存有问题。似乎我没有正确释放或释放对象,因为我在游戏中得到了这种微妙的内存积累。

我像这样初始化所有对象:

self = [super init];
if (self != nil) {
    //inititalize object
}

我在 dealloc 方法中释放所有对象,如下所示:

[object release], object = nil;

现在我觉得我应该提到我的游戏在视图上运行。我的主视图将子视图加载到一个名为“currentView”的变量中。我像这样在视图之间切换。

if (currentView != nil) {
    [currentView dealloc];
}
currentView = [[newView alloc] initWithVariables:vars];

我想知道问题是我的对象初始化和释放还是视图问题。我还想知道我可以使用哪些策略来追踪仪器中未出现的任何泄漏。

我需要尽快获得此信息,如果您能提供帮助,我们将不胜感激。谢谢。

编辑:当我通过仪器运行它时,它会显示我的应用程序使用的内存。它有一个奇怪的模式。当它加载第一个视图时,它从大约开始。使用了 17mb。然后我切换到第二个视图,它上升到 22mb。现在,如果我回到第一个视图,它不会再次下降到 17mb,而是下降到大约 20mb。现在,当我继续在两者之间切换时,它会在 22mb 和 20mb 之间切换,并且几乎保持不变。这怎么解释?

EDIT2:上述编辑中解释的模式在整个游戏中是一致的。由于这种一致性,我注意到我的游戏中每级泄漏 70kb。显然,当我的游戏保持在 100mb 以下时,这不会造成任何问题,因此除非他们长时间玩我的游戏,否则这应该不是问题。

尽管如此,我仍然想知道如何追踪 70kb 的泄漏。

【问题讨论】:

  • 系统缓存了很多东西,所以当你从视图返回时,东西不一定会“下降”。并且永远不要(在正常情况下)做dealloc。如果release 不起作用,那是因为您在某处隐藏了retain

标签: ios memory-management ios4 dealloc alloc


【解决方案1】:

您应该使用release 而不是dealloc。对alloc 的每次调用都应与releaseautorelease 匹配;在你的情况下,release 因为你想控制它什么时候被释放。

【讨论】:

  • 奇怪的是,事情变得更糟了。我使用 dealloc 是因为 release 曾经导致崩溃,现在当我使用 release 时,它​​会加速泄漏大约 5 倍。
  • 如果某个版本导致崩溃,则表明其他地方存在问题。您是否为 currentView 设置了@property?如果设置为保留,则使用self.currentView = nil 释放视图就足够了,然后使用self.currentView = [[[newView alloc] init] autorelease]; 设置新视图。注意self. 在使用@property (retain) 时非常重要
  • 它不再崩溃了,它只是比dealloc泄漏更多一点。我不明白为什么会有所不同,但确实如此。
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2016-10-16
  • 2014-06-06
  • 2011-04-29
相关资源
最近更新 更多