一系列词典& mem mgmt

时间:2011-04-10 16:39:59

标签: iphone objective-c

我有一系列字典,工作正常。我正在尝试追踪内存访问问题,并希望了解:

如果我为字典创建自动释放字符串,例如一个字符串来自:

NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
for (NSString *file in dirContents)

当我这样做时

NSDictionary *dictItem = [NSDictionary dictionaryWithObjectsAndKeys:file, @"file"...

结果dictItem是否保留单个字符串?我一直在假设; - )

然后我将dictItem添加到数组中。我假设对NSMutableArray的addObject调用将为我保留dictItem ...

什么时候释放内存? 如果我只是在数组上调用removeAllObjects(现在崩溃),它会释放字典中的所有字符串以及字典本身吗?

希望这有点可以理解; - )

谢谢!

2 个答案:

答案 0 :(得分:1)

这是Cocoa系列内存管理的快速哨声之旅......

  • NSDictionary不保留密钥。相反,它会创建密钥的副本。换句话说,在字典中添加对象作为键不会增加其保留计数。
  • NSDictionary将保留您传递它的键的值。
  • 当你释放(并最终解除分配)NSDictionary时,它负责调用它所存储的对象的释放(不是你!)
  • NSArray将保留您添加到其中的任何对象
  • NSArray会释放它所拥有的所有对象,以及何时解除分配

了解以上内容......

  • dicItem不会保留您的密钥@“文件” - 它会将其复制
  • dicItem将保留您的文件对象
  • 当dicItem被解除分配时,它将在其@“文件”和文件的副本上调用release
  • 当您向阵列添加dicItem时,它将被保留
  • 当你释放你的数组并且它被解除分配时,它所持有的所有dicItems都将被发送一条释放消息
  • 释放你的数组应该随后触发你的dicItem对象的dealloc - 只要它们在别处被引用(即泄露)
  • 您不需要向NSArray对象发送removeAllObjects消息 - 数组本身将自行清理。

答案 1 :(得分:0)

我认为你让它变得有点复杂。您需要真正担心的唯一内存管理是在您自己的类中。当添加到NSArray时,它实际上保留了对象,然后当你调用removeAllObjects或者数组被销毁时,它将释放所有包含的对象。然而,这是“拥有”一个对象的概念很重要的地方。当任何对象获得对象的引用时,它可以在其上调用“retain”以指示它拥有该对象(这也适用于分配新对象或使用“new”运算符)。这意味着,对象肯定知道对象将一直存在,直到完成它为止。为了表明它已经完成了对象,它应该始终释放或自动释放对象并将引用设置为nil。

所以底线,如果你不在对象上调用retain,alloc或new,你就不应该调用release。如果你确实调用了其中一个函数,你应该总是在它上面调用release或autorelease。对于您可以发送引用的任何其他对象,您可以假设它将获得它的所有权,如果它需要,它将始终在完成时释放它。

相关问题