我有一个很大的 NSDictionary,里面有一个较小的 NSDictionary。我想自动释放较大的一个,并保留第二个。我的初始化方法中有这段代码:
// Autoreleased stage dictionary NSString *plistPath = [[NSBundle mainBundle] pathForResource:map ofType:@"plist"]; NSDictionary *mapDict = [NSDictionary dictionaryWithContentsOfFile:plistPath]; // Owned items citiesDictionary = [[mapDict objectForKey:@"Cities"] retain];
citiesDictionary 在类接口(interface)中声明为:
NSDictionary *citiesDictionary;
如果我尝试使用以下行在 dealloc 中释放 citiesDictionary,它会崩溃。
[citiesDictionary release];
但是如果我不解除分配 citiesDictionary,当我解除分配包含 citiesDictionary 的类时,Instruments 会报告内存泄漏。我承认 mapDict 在初始化结束时被释放。即使我在 citiesDictionary 上调用了 retain,此重新分配是否会影响它?
如果是这样,我怎样才能在释放较大的字典的同时保留较小的字典?我在分配 citiesDictionary 时尝试了不同的东西,但似乎没有什么能正常工作。我尝试过的一些方法:
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];
和
citiesDictionary = [NSDictionary initWithDictionary:[mapDict objectForKey:@"Cities"]];
甚至
citiesDictionary = [NSDictionary initWithDictionary:[[mapDict objectForKey:@"Cities"] copy]];
最佳答案
将字典复制到citiesDictionary
。
NSString *plistPath = [[NSBundle mainBundle] pathForResource:map ofType:@"plist"];
NSDictionary *mapDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];
现在您可以确保拥有字典的副本,即使包含的对象可以随时释放。请记住随后还要发布 citiesDictionary。
请注意,在使用 copy
时,您将始终获得一个不可变的 NSDictionary
,即使原始对象是一个 NSMutableDictionary
。如果需要,使用 mutableCopy
获取 NSMutableDictionary
。
关于Objective-C:在自动发布的 NSDictionary 中保留 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5643245/