我有一系列字典,工作正常。我正在尝试追踪内存访问问题,并希望了解:
如果我为字典创建自动释放字符串,例如一个字符串来自:
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(现在崩溃),它会释放字典中的所有字符串以及字典本身吗?
希望这有点可以理解; - )
谢谢!
答案 0 :(得分:1)
这是Cocoa系列内存管理的快速哨声之旅......
了解以上内容......
答案 1 :(得分:0)
我认为你让它变得有点复杂。您需要真正担心的唯一内存管理是在您自己的类中。当添加到NSArray时,它实际上保留了对象,然后当你调用removeAllObjects或者数组被销毁时,它将释放所有包含的对象。然而,这是“拥有”一个对象的概念很重要的地方。当任何对象获得对象的引用时,它可以在其上调用“retain”以指示它拥有该对象(这也适用于分配新对象或使用“new”运算符)。这意味着,对象肯定知道对象将一直存在,直到完成它为止。为了表明它已经完成了对象,它应该始终释放或自动释放对象并将引用设置为nil。
所以底线,如果你不在对象上调用retain,alloc或new,你就不应该调用release。如果你确实调用了其中一个函数,你应该总是在它上面调用release或autorelease。对于您可以发送引用的任何其他对象,您可以假设它将获得它的所有权,如果它需要,它将始终在完成时释放它。