Ios 共享不可变字符串

Ios 共享不可变字符串,ios,nsstring,nsdictionary,Ios,Nsstring,Nsdictionary,我有一个大约10k本字典的列表,每本字典包含大约50个键。所有字典的键或多或少都是相同的 使用NSDictionary.alloc.initWithContentsOfFile加载数据 键对象似乎在不同的字典之间重用,因此内存中没有大约500k个字符串,每个唯一键只有一个字符串,因此只有几百个 因此,我想知道这是否是initWithContentsOfFile方法的预期行为,我可以依赖它,还是在某些情况下,我会在不同的字典中为相同的键获取不同的字符串对象?您正在体验的是Objective-C实现

我有一个大约10k本字典的列表,每本字典包含大约50个键。所有字典的键或多或少都是相同的

使用NSDictionary.alloc.initWithContentsOfFile加载数据

键对象似乎在不同的字典之间重用,因此内存中没有大约500k个字符串,每个唯一键只有一个字符串,因此只有几百个


因此,我想知道这是否是initWithContentsOfFile方法的预期行为,我可以依赖它,还是在某些情况下,我会在不同的字典中为相同的键获取不同的字符串对象?

您正在体验的是Objective-C实现的一个功能。我不知道这是Cocoa还是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将为每个键添加一个retain,即使它只在内存中存在一次。您不必担心它会消失。

我不相信相同的字符串总是相同的字符串。这基本上是会发生的,但是像initWithContentsOfFile这样的东西,其实现的一部分深深地埋藏在Objective-C的蜘蛛网密室中,没有凡人敢涉足,而且很可能也无法保证。