0

私は約1万の辞書のリストを持っています。各辞書には約50のキーが含まれています。キーは、すべての辞書でほぼ同じです。

データは、NSDictionary.alloc.initWithContentsOfFileを使用してロードされます。

キーオブジェクトは異なる辞書間で再利用されているようです。したがって、メモリに約500kの文字列を含める代わりに、一意のキーごとに1つの文字列しかなく、数百の文字列しかありません。

それで、それがinitWithContentsOfFileメソッドの予想される動作であり、それを信頼できるのか、それとも異なる辞書の同じキーに対して異なる文字列オブジェクトを取得する状況があるのでしょうか。

4

1 に答える 1

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 は、メモリ内に一度しかない場合でも、各キーに保持を追加します。消える心配はありません。

于 2012-09-07T17:56:23.467 に答える