共享不可变的NSStrings

时间:2012-09-07 17:06:11

标签: ios nsstring nsdictionary

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

使用NSDictionary.alloc.initWithContentsOfFile加载数据。

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

所以我想知道它是否是 initWithContentsOfFile 方法的预期行为,我可以依赖它,或者在某种情况下我会为不同的词典中的相同键获得不同的字符串对象?< / p>

1 个答案:

答案 0 :(得分:2)

您所遇到的是Objective-C实现的一项功能。我不知道它是否仅限于Cocoa或Objective-C。这是一个内存优化。

NSString *myString1 = @"Hello!";
NSString *myString2 = @"Hello!";
if (myString1 == myString2) {
   NSLog(@"Same");
}

myString1和myString2都指向相同的内存位置。控制台将打印Same。

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都会为每个键添加一个保留,即使它只在内存中一次。你不必担心它会消失。