2012-09-07 14 views
0

我有10K左右词典列表,每个字典包含大约50个键。所有字典的键都差不多。共享一成不变NSString的

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

看来,关键的对象是不同的字典之间的重用,并因此,不是在内存中大约50万串,我每有唯一的密钥只有一个字符串,因此只是一对夫妇数百人。

所以我想如果这是initWithContentsOfFile方法的预期行为,我可以依靠它,还是有一些情况时,我会得到不同的字符串对象在不同的​​字典相同的密钥?

+3

我不会依赖于相同的字符串总是被相同的字符串。这很可能会发生,但像initWithContentsOfFile这样的东西,其部分实现深埋在Objective-C的蜘蛛网填充的酒窖中,没有凡人敢于践踏,并且可能无法保证。 –

回答

2

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