Objective-C:在自动发布的 NSDictionary 中保留 NSDictionary

标签 objective-c ios memory-management nsdictionary

我有一个很大的 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/

相关文章:

ios - 如何传递 NSMutableDictionary 作为引用?

iphone - UIImageView动画结束后的访问方法

ios - UICollectionViewCell 拖动动画

iphone - 多线程 iPhone 应用程序因 [NSAutoreleasePool release] 崩溃

ios - 如何将解析对象字段从一个类发送到另一个类?

ios - 更改动态 TableView 中的特定单元格,Swift

iphone - UIScrollView 将触摸发送到 subview

ios - willSelectRowAtIndexPath 不改变 detailTextLabel

c - 缓冲区溢出漏洞: sh: 1: Syntax error: Unterminated quoted string : Developing exploit for personal enrichment

java - Java非堆内存和栈内存有什么区别?如果不是,它们是否相同?它们之间有什么区别?