2012-06-04 50 views
1

我需要了解内存在目标C中的管理方式。我知道基本知识,如果您创建并拥有内存,则必须自行释放内存。 然而,当它到达代码,如:了解仪器和内存管理

self.storeDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath2]; 

做我自己呢?我必须释放这个记忆吗?

self.storeDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath2]; 
//73.3% leak 
totalCharacters = [storeDict count]; 
tagCounter = 1; 

dictKeyArray = [[storeDict allKeys] mutableCopy]; 
//13.3% leak 

当Instruments在突出显示的泄漏旁边放置一堆百分比时,那告诉我什么?它是否告诉我相对于泄漏内存总量的泄漏大小?
还有最后一件事情......分配的内存数量是否持续增加是正常的?还是应该稳定在某个地方? 感谢您的帮助!一切都非常感谢!

回答

2

在大多数情况下,您只拥有名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法返回的对象。当然,你也拥有你发送的任何东西-retain。这些规则的例外情况应在不合格方法的文件中予以说明。

参见https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-SW1

仪器属性的泄漏向创建该对象的线。但是,这不一定是泄漏对象的代码。如果指向对象的指针被传递给其他代码,并且代码没有平衡其保留和释放,那么该代码负责泄漏。工具可以向您显示特定对象的保留和发布历史,您必须查看这些历史记录才能了解哪些代码没有正确履行其所有权责任。另外,如果一个对象被另一个对象所拥有,并且它实际上是第二个被泄露的对象,那么它所拥有的所有内容将会以“过渡性”的方式泄露。因此,在尝试追踪已泄漏的低级别对象之前,请查找泄漏的高级对象。通常情况下,泄漏的对象泄露的对象较少,这些对象是泄露对象图的根。

无论是记忆力持续上升还是稳定是正常的,这取决于一点。通常,内存使用应该稳定。但是,如果您的应用程序真的做得越来越多,那么它的内存使用量可能会持续增加。例如,如果应用程序正在通过网络接收数据并在其中累积结果,则随着更多数据到达,其内存使用率可能会增加。但如果它在某个合理的地方没有停下来,那就是一个问题。在iOS设备上,系统最终会杀死它。

+0

谢谢!你的回答非常有帮助,我想我现在明白了! – wayway