Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:在自动删除的NSDictionary中保留NSDictionary_Objective C_Ios_Memory Management_Nsdictionary - Fatal编程技术网

Objective c 目标C:在自动删除的NSDictionary中保留NSDictionary

Objective c 目标C:在自动删除的NSDictionary中保留NSDictionary,objective-c,ios,memory-management,nsdictionary,Objective C,Ios,Memory Management,Nsdictionary,我有一本大词典,里面有一本小词典。我想自动释放较大的一个,并保留第二个。我的init方法中有以下代码: citiesDictionary在类接口中声明为: 如果我尝试使用以下行在dealloc中发布citiesDictionary,它将崩溃 但是如果我不释放citiesDictionary,当我释放包含citiesDictionary的类时,我会在Instruments中报告内存泄漏。我承认mapDict在init结束时被解除分配。即使我打了电话给retain,这种取消分配是否会影响cities

我有一本大词典,里面有一本小词典。我想自动释放较大的一个,并保留第二个。我的init方法中有以下代码:

citiesDictionary在类接口中声明为:

如果我尝试使用以下行在dealloc中发布citiesDictionary,它将崩溃

但是如果我不释放citiesDictionary,当我释放包含citiesDictionary的类时,我会在Instruments中报告内存泄漏。我承认mapDict在init结束时被解除分配。即使我打了电话给retain,这种取消分配是否会影响citiesDictionary

如果是这样,我怎样才能保留较小的词典,同时释放较大的包含词典的词典?在分配citiesDictionary时,我尝试了不同的方法,但似乎没有任何方法能正常工作。我尝试过的一些方法:

甚至


感谢您的帮助。谢谢。

将词典复制到
citiesDictionary

NSString *plistPath = [[NSBundle mainBundle] pathForResource:map ofType:@"plist"];
NSDictionary *mapDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];
现在,您可以确保拥有字典的副本,即使包含的对象可以随时释放。请记住,随后还要发布citiesDictionary


请注意,在使用
copy
时,即使原始对象是
NSMutableDictionary
,也始终会得到一个不可变的
NSDictionary
。如果需要,可以使用
mutableCopy
获取
NSMutableDictionary

您在某个地方过度删除了citiesdictionary,因为您已经在init方法中调用了retain。Map dict仅在自动删除时发布citiesdictionary一次,但不会取消您在init方法中执行的保留


您应该尝试检查其他方法,以便在字典中找到发布声明,或者让静态分析器告诉您。

谢谢您的评论。经过几个小时的反复思考,我发现了问题的根源

这完全是我的错:我在一个与citiesDictionary相关的NSMutableDictionary中插入了一个内存管理有缺陷的自定义类,而释放另一个类会导致内存损坏

现在,两个

做得很好


注:StackOverflow霸主:鉴于问题的解决方案与主要问题完全无关,我应该投票删除这个问题,还是保留它作为参考?

谢谢你的回答。我尝试了一些东西,把问题扩大了一点。我已经试过复制字典,但是它在[citiesDictionary release]上崩溃了。你确定除了
-dealloc
,你没有在代码中的任何其他地方发布
citiesDictionary
?是的,我很确定我没有明确地在其他地方发布它。这里有些不对劲。尝试运行静态分析器,看看它是否有任何想法。再次感谢您,请参阅下面我的答案,了解是什么导致了它。如何通过仪器(或其他)运行静态分析仪?我通常使用“泄漏”工具。谢谢你的评论。看看我对引起它的原因的回答(完全是我的错)。如何使用静态分析器?我通常在仪器上使用“泄漏”设置。
NSDictionary *citiesDictionary;
[citiesDictionary release];
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];
citiesDictionary = [NSDictionary initWithDictionary:[mapDict objectForKey:@"Cities"]];
 citiesDictionary = [NSDictionary initWithDictionary:[[mapDict objectForKey:@"Cities"] copy]];
NSString *plistPath = [[NSBundle mainBundle] pathForResource:map ofType:@"plist"];
NSDictionary *mapDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];
citiesDictionary = [[mapDict objectForKey:@"Cities"] release];
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];