我是ObjectiveC和Xcode的新手并且犯了错误。这段代码从getAllRecords获取字典(myDataPlist)。然后我在(myDataPlist)中制作一个字典(1条记录)的可变副本,并用它解密1个字段。这非常有效。我只返回那条记录(mutCopy)。这也有效。我的问题是原始字典(myDataPlist)的变化。它解密的记录也在(myDataPlist)中解密。 2 NSLog(@“%@”,myDataPlist)返回不同的结果。我肯定错过了什么。为什么(myDataPlist)会改变?
感谢您的帮助。
-(NSDictionary *)getRecordForKey:(NSString *)key{
NSDictionary *myDataPlist = [self getAllRecords];
NSMutableDictionary *mutCopy = [[myDataPlist valueForKey:key] mutableCopy];
NSArray *keys = [mutCopy allKeys];
NSData *tData = [[NSData alloc]init];
NSLog(@"%@",myDataPlist);
for (int x = 0; x <= [keys count] - 1; x++) {
if (![keys[x] isEqualToString:@"Template"] && ![keys[x] isEqualToString:@"RecNum"]) {
NSMutableArray *myArray = [mutCopy objectForKey:keys[x]];
tData = myArray[1];
NSString *tString = [tData decryptData:tData withKey:self.settingsManager.masterPad];
myArray[1] = tString;
[mutCopy setObject:myArray forKey:keys[x]];
}
}
NSLog(@"%@",myDataPlist);
return mutCopy ;
}
答案 0 :(得分:2)
mutableCopy
仅创建字典的副本,而不是其内容。因此,您从[[myDataPlist valueForKey:key] mutableCopy]
收到的字典本质上是一个新的字典,引用了相同的对象(它不是深层副本)。
尝试使用
NSMutableDictionary *mutCopy =
[[NSMutableDictionary alloc] initWithDictionary:[myDataPlist valueForKey:key]
copyItems:YES];
而不是mutableCopy
。
来自Apple文档:
otherDictionary
包含键和值的字典 初始化新词典。
标志
如果是,则每个对象都在 otherDictionary接收copyWithZone:消息来创建副本 对象对象必须符合NSCopying协议。在一个 托管内存环境,这是保留消息而不是 否则会收到对象。然后将对象副本添加到 返回字典。如果为NO,则在每个托管内存环境中 otherDictionary中的对象只是接收到保留消息 添加到返回的字典中。
如果您的字典包含自定义对象,请确保它们符合NSCopying协议。