0

我几乎是 Objective-c 的新手,当我开始编程时,我并没有真正掌握如何正确释放对象。所以,我的项目是对 Objective-c 世界的介绍,我完全省略了它。然而,现在,我认为这个项目的演变在于,只留下它太可惜了。所以,除了所有的allocs、copys 和news,我在理解为什么我的项目仍然泄漏这么多内存方面存在严重问题。

我使用了 Instruments 中的泄漏工具(看截图),它向我展示了泄漏的整个对象数组。我现在的问题是:这是值得担心的事情,还是这些物体在某个时候被释放?如果不是,我如何找到泄漏的原因?我知道如果我按 cmd + e 它会显示扩展的详细信息窗口,但是我应该查看哪些方法?我假设这是我自己的方法我必须打开,但大多数时候它说,即层的分配和初始化会导致问题。

也就是说,我想知道如何有效地检测泄漏。当我查看leaks工具栏时,在我的游戏层 ( HelloWorldLayer) 初始化时会出现一条红色的红线。然而,这只是在它的初始化......所以,我需要担心这个吗?

这是屏幕截图:文件链接(为了放大)-> http://i.stack.imgur.com/QXgc3.jpg

在此处输入图像描述

编辑:
我解决了几个泄漏,但现在我有另一个我不太明白的泄漏:

for (int i = 1; i<=18; i++) {
            NSMutableDictionary *statsCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)stats, kCFPropertyListMutableContainers);
            NSNumber *setDone = [num copy];
            [levels setObject:statsCopy forKey:[NSString stringWithFormat:@"level%d", i]];
            [levels setObject:setDone forKey:@"setDone"];
            [statsCopy release];
            [setDone release];
        }

他碰巧检测到深层副本的泄漏,即使我释放它......

4

1 回答 1

1

屏幕截图显示有一个分配的字典-[Categories init]永远不会被释放。实际上,有很多(2765)这样的字典。

该方法似乎正在调用-[NSDictionary newWithContentsOf:immutable:]. 由于 Cocoa 内部的优化,此处的堆栈跟踪可能有些误导。这不是公共方法。它可能是由另NSDictionary一种带有尾调用的方法调用的,该方法已优化为跳转而不是子例程调用。

Assuming there's debug information available, Instruments should show you the precise line within -[Categories init] if you double-click that line in the stack trace.

知道它被分配到哪里并不是全部。该类Categories可以正确管理对象的所有权。但是,其他一些类可能会访问它,并过度保留或释放它。因此,您可能必须跟踪其中一个对象的保留和释放的整个历史,以查看哪个类获得了所有权并忽略了释放它。请注意,必须为泄露的字典之一执行此操作,而不是字典内部使用的 malloc 块之一。在表格中向下两行查找一些有前途的候选人。切换打开该行以查看特定对象。双击一个或单击其地址旁边的带圆圈的箭头按钮(我忘记了)以查看保留和释放的历史记录。

于 2012-05-27T10:36:42.473 回答