4

我有一个由其键和对象NSDictionary的实例填充的对象。NSMutableString我已经能够通过NSMutableString使用该setString:方法更改原始密钥来更改密钥。但是,无论最初用于设置密钥的字符串的内容如何,​​它们的密钥都保持不变。

我的问题是,密钥是否受到保护以防被更改,这意味着除非我将其删除并将另一个密钥添加到字典中,否则它将始终相同?

谢谢。

4

3 回答 3

10

设置项目时,键是-copy'd,因此您以后无法更改它是无用的。

向字典添加条目的方法——无论是作为初始化的一部分(对于所有字典)还是在修改期间(对于可变字典)——复制每个键参数(键必须符合NSCopying协议)并将副本添加到字典中。每个对应的值对象都会收到一条保留消息,以确保在字典使用完之前不会释放它。

您可以将 CFDictionary 与 kCFTypeDictionaryKeyCallBacks 一起使用,或者只替换该项目:

id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];
于 2010-05-09T10:25:34.843 回答
2

尝试使用NSMutableDictionary, 代替。

于 2010-05-09T10:22:45.897 回答
2

您可以创建字典的副本,随时过滤键。我这样做是为了在使用 KVC 从 JSON 填充对象时在驼峰式大小写和下划线之间进行转换。请参阅我的重构库es_ios_utils获取源代码。 ESNSCategories.h提供:

@interface NSMutableDictionary(ESUtils)
    //Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten.
    -(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter;
...

因此,要将所有键设为大写,您可以执行以下操作:

NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
               withKeyFilter:^NSString*(NSString *key) { 
                                 return key.uppercaseString;
                             }];
于 2011-06-08T18:33:38.217 回答