泄漏对象而不调用alloc,new,copy?

时间:2012-05-27 09:58:23

标签: objective-c ipad memory-leaks cocos2d-iphone

我几乎是objective-c的新手,当我开始编程时,我并没有真正掌握如何正确释放对象。所以,我的项目是对Objective-c世界的介绍,我完全省略了它。然而,现在,我认为这个项目的发展是因为将它留在那里真是太遗憾了。因此,除了所有alloc s,copynew之外,我在理解为什么我的项目仍然泄漏了太多内存时遇到了严重问题。

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

那就是说,我想知道如何有效地检测泄漏。当我查看leaks条的乐器时,在我的游戏图层(HelloWorldLayer)的初始化时,会出现一条biiiig红线。但是,这只是在初始化时......所以,我是否要担心这个问题?

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

enter image description here

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

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];
        }

他碰巧用深拷贝检测到泄漏,即使我发布了它......

1 个答案:

答案 0 :(得分:1)

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

该方法似乎在调用-[NSDictionary newWithContentsOf:immutable:]。由于Cocoa内部的优化,这里的堆栈跟踪可能有些误导。那不是公共方法。它可能被另一个NSDictionary方法调用,尾调用优化为跳转而不是子程序调用。

假设有可用的调试信息,如果双击堆栈跟踪中的那一行,Instruments会在-[Categories init]内显示精确的行。

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