共享不可变的NSString
我有一个约10k字典的列表,每个字典包含约50个密钥。 所有字典的键都差不多。
数据使用NSDictionary.alloc.initWithContentsOfFile加载。
看来,关键的对象是不同的字典之间重用,因此,而不是有大约500K的string在内存中,我只有一个string每个唯一的关键,因此只有几百个。
所以我想知道是否initWithContentsOfFile方法的预期行为,我可以依靠它,或者有一些情况下,我会在不同的字典中的相同的键获取不同的string对象?
你正在经历的是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不会指向相同的内存位置
在这种情况下,控制台将打印不一样的,然后string匹配。 通过使用==来比较string是不安全的。 NSString有一个叫做isEqualToString的特殊方法:用于比较。 有可能得到相同的“字母串”,因为它们占据不同的存储位置,所以不能等于相同的“字母串”。
无论如何,在你的问题中,如果你使用initWithContentsOfFile来加载一个字典,你不必担心在几个字典间共享键值。 每个NSDictionary都会为每个键添加一个保留,尽pipe它只在内存中一次。 你不必担心它消失。