【问题标题】:Sharing immutable NSStrings共享不可变的 NSStrings
【发布时间】:2012-09-07 17:06:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不会依赖相同的字符串总是相同的字符串。这大部分都会发生,但是像 initWithContentsOfFile 这样的东西的部分实现被深埋在 Objective-C 蜘蛛网般的地下室里,凡人都不敢涉足,而且可能无法保证。

标签: ios nsstring nsdictionary


【解决方案1】:

您所体验的是 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: 用于比较。有可能得到相同的“字母串”不等于相同的“字母串”,因为它们占用不同的内存位置。

无论如何,在您的问题中,如果您使用 initWithContentsOfFile 加载字典,则无需担心在多个字典之间共享键值。每个 NSDictionary 都会为每个键添加一个保留,即使它只在内存中一次。您不必担心它会消失。

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2017-10-28
    • 2017-10-03
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多