我有大约1万个词典的列表,每个词典包含约50个键。所有字典的键大致相同。
使用NSDictionary.alloc.initWithContentsOfFile加载数据。
看来关键对象在不同的字典之间可以重复使用,因此内存中没有大约50万个字符串,每个唯一键只有一个字符串,因此只有数百个。
因此,我想知道这是否是initWithContentsOfFile方法的预期行为,并且我可以依靠它,还是在某些情况下,当我在不同的词典中为相同的键获取不同的字符串对象时?
最佳答案
您正在体验的是Objective-C实现的功能。我不知道它是否是可可或Objective-C的专有产品。这是内存优化。
NSString *myString1 = @"Hello!";
NSString *myString2 = @"Hello!";
if (myString1 == myString2) {
NSLog(@"Same");
}
myString1和myString2都指向相同的内存位置。控制台将打印相同。
NSString *myString1 = [[NSString alloc] initWithString:@"Hello!"];
NSString *myString2 = [[NSString alloc] initWithString:@"Hello!"];
if (myString1 == myString2) {
NSLog(@"Same");
} else {
NSLog(@"Not the same");
}
if ([myString1 isEqualToString:myString2]) {
NSLog(@"String matches");
}
myString1和myString2将不会指向相同的内存位置
在这种情况下,控制台将打印“不一样”,然后显示“字符串匹配”。使用==比较字符串是不安全的。 NSString有一个称为isEqualToString:的特殊方法用于比较。因为它们占据不同的内存位置,所以有可能使相同的“字母字符串”不等于相同的“字母字符串”。
无论如何,在您的问题中,如果您要使用initWithContentsOfFile来加载字典,则无需担心在多个字典之间共享键值。每个NSDictionary将为每个键添加一个保留,即使它仅在内存中一次。您不必担心它消失了。