gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:17:23 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com