1

1 つから 4 つのオブジェクトを含む NSMutableDictionary があります。含まれている各オブジェクトは NSDictionary です。最初のディクショナリには、NSManagedObjects への約 83,000 の参照が含まれています。2 番目のディクショナリには、約 14,000 の同じ種類のオブジェクトが含まれています。

以下のコードでは、NSLog ステートメントで何も起こりません。あたかもスキップされたかのように、プログラムは引き続き実行されます。しかし、その後すぐにこれらの辞書で別の問題が発生します。最初にこれをクリアすることで、残りの問題に光が当たるかもしれないと思いました.

pos = @"v";
NSLog(@"%@", pos);
[request setEntity:[NSEntityDescription entityForName:@"SYNSET" inManagedObjectContext:[ManagedObjectContext moc]]];
predicate = [NSPredicate predicateWithFormat:@"partOfSpeech = %@", pos];
[request setPredicate:predicate];
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"synsetOffset" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
synsetsArrayForPos = [[ManagedObjectContext moc] executeFetchRequest:request error:&error];
synsetDictionaryMutableForPos = [[NSMutableDictionary alloc] initWithCapacity:100000];
for (SYNSET *synset in synsetsArrayForPos)
    [synsetDictionaryMutableForPos setObject:synset forKey:[NSString stringWithFormat:@"%@",synset.synsetOffset]];
[dictionaryMutableOfSynsetDictionaries setObject:[NSDictionary dictionaryWithDictionary:synsetDictionaryMutableForPos] forKey:pos];

NSLog(@"dictionaryMutableOfSynsetDictionaries is class of %@ with description %@", [dictionaryMutableOfSynsetDictionaries class], [dictionaryMutableOfSynsetDictionaries description]);

pos = @"a";
NSLog(@"%@", pos);

の値を変えてこのコードを 4 回繰り返しますがpos、そのたびに、最上位のdictionaryMutableOfSynsetDictionaries辞書の説明を出力する NSLog が出力されません。「[dictionaryMutableOfSynsetDictionaries description]」を文字列定数に置き換えると、出力されます。

ここで何が起きてるの?これは予期された動作ですか、それとも何か間違ったことをしていますか?

(このコードは、大規模な辞書とともに、大規模な sqlite データベースの関係リンクを完成させるために使用されており、デプロイ可能なコードでは使用されません。iOS シミュレーターのみで実行しています。更新したものを配置します。この更新が完了すると、アプリ バンドルにデータベースが追加されます)。

4

1 に答える 1

0

何が起こっているのかわかりましたが、コンソールに出力されない理由が完全にはわかりません。

NSDictionary の description メソッドは、辞書の内容を表す文字列をプロパティ リストとしてフォーマットして返します。このような大規模なディクショナリの場合、100,000 レコード程度のコンテンツ全体がログに記録されます。

これを行うpo [[dictionaryMutableOfSynsetDictionaries description] substringToIndex:1000]と、最初の 1000 文字が表示されます。このように短くしないと、文字列を作成するのに時間がかかり、コンソールに表示するのに永遠に時間がかかります。

問題行の前後のログ ステートメントで、質問のログ ステートメントが印刷されていないことを確認しましたが、前後のログは印刷されています。だからNSLogはこれを捨てていると思います。

于 2012-11-25T06:14:56.960 に答える