我有一个大约 10k 字典的列表,每个字典包含大约 50 个键。所有字典的键或多或少都相同。
使用 NSDictionary.alloc.initWithContentsOfFile 加载数据。
似乎键对象在不同的字典之间重用,因此内存中没有大约 50 万个字符串,每个唯一键只有一个字符串,因此只有几百个。
所以我想知道这是否是initWithContentsOfFile方法的预期行为并且我可以依赖它,或者在某些情况下我会为不同字典中的相同键获得不同的字符串对象?
我有一个大约 10k 字典的列表,每个字典包含大约 50 个键。所有字典的键或多或少都相同。
使用 NSDictionary.alloc.initWithContentsOfFile 加载数据。
似乎键对象在不同的字典之间重用,因此内存中没有大约 50 万个字符串,每个唯一键只有一个字符串,因此只有几百个。
所以我想知道这是否是initWithContentsOfFile方法的预期行为并且我可以依赖它,或者在某些情况下我会为不同字典中的相同键获得不同的字符串对象?
您正在经历的是 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 不会指向同一个内存位置
在这种情况下,控制台会打印 Not the same,然后 String 匹配。使用 == 比较字符串是不安全的。NSString 有一个特殊的方法叫做 isEqualToString: 用于比较。有可能使相同的“字母串”不等于相同的“字母串”,因为它们占用不同的内存位置。
Anyway, in your question, you if you're using initWithContentsOfFile to load a dictionary, you don't need to worry about having key values shared across several dictionaries. Each NSDictionary will add a retain to each key, even though it's only in memory once. YOu don't need to worry about it disappearing.