Iphone 我应该释放从[NSMutableDictionary ValueForKey:]返回的数组吗

Iphone 我应该释放从[NSMutableDictionary ValueForKey:]返回的数组吗,iphone,nsmutabledictionary,Iphone,Nsmutabledictionary,我有一个NSMutableDictionary,其中键是对象名称的第一个字母表。该视图类似于iphone上的“联系人”选项卡。此外,用户还可以选择列表中的单个对象 在代码中,我找到每个选定的对象以进一步处理它们 NSMutableArray *objectsToAdd = [[NSMutableArray alloc] init]; NSMutableArray *array = nil; for (NSString *key in self.nameIndex) { ar

我有一个NSMutableDictionary,其中键是对象名称的第一个字母表。该视图类似于iphone上的“联系人”选项卡。此外,用户还可以选择列表中的单个对象

在代码中,我找到每个选定的对象以进一步处理它们

NSMutableArray *objectsToAdd = [[NSMutableArray alloc] init];
NSMutableArray *array      = nil;

for (NSString *key in self.nameIndex) {

    array = (NSMutableArray *)[searchedNameDictionary valueForKey:key];    
    for (Objects *eachObject in array) {
        if (eachObject.objectIsSelected){
            [objectsToAdd addObject:eachObject];
        }
    }           
}
[array release];

-(void)dealloc()
{
    [searchedNameDictionary release];
}
当我发布searchedNameDictionary时,应用程序正在崩溃,并显示一条消息,表示正在引用解除分配的对象

现在,如果在上面的代码中,我删除了[array release],该应用程序运行良好

我的问题是,释放“数组”实际上是释放searchedNameDictionary中的对象吗?这似乎就是正在发生的事情

释放数组是否会导致内存泄漏?

数组=(NSMutableArray*)[searchedNameDictionary值forkey:key]

这将返回一个自动释放的对象,因此不需要释放它


您的代码也有一些其他问题,但主要是样式方面的问题。摆脱[array release]后,就这个问题而言,您就可以继续了。

您不应该
释放返回的对象,除非它们来自
alloc
复制
方法


返回的对象是
自动释放的
,否则,如果您想保留它,您应该
在收到它后立即保留它。

谢谢,我应该应用内存管理的基本原则。现在对代码更加自信。再次感谢您回答我的问题。是的,删除[array release]解决了问题,正如您所说,我正在释放一个自动释放的对象。从apple文档中,我很难找到一个方法何时返回自动释放的对象,何时不返回。有没有办法知道方法返回的对象是什么类型的(自动删除还是不自动删除)。是的,只需遵循基本规则。如果您使用名称以“alloc”或“new”开头或包含“copy”的方法(例如,alloc、newObject或mutableCopy)创建对象,您将获得对象的所有权,或者如果您向其发送保留消息。您有责任使用“释放”或“自动释放”放弃您拥有的对象的所有权。任何其他时间收到对象时,您都不能释放它。“这适用于所有情况。”。