【问题标题】:Can't log description of NSMutableDictionary无法记录 NSMutableDictionary 的描述
【发布时间】:2012-11-25 03:59:30
【问题描述】:

我有一个 NSMutableDictionary,其中包含一到四个对象。每个包含的对象都是一个 NSDictionary。第一个字典包含大约 83,000 个对 NSManagedObjects 的引用。第二个字典包含大约 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);

我用 pos 的不同值重复此代码四次,每次打印顶级 dictionaryMutableOfSynsetDictionaries 字典描述的 NSLog 都无法打印。如果我用字符串常量替换 `[dictionaryMutableOfSynsetDictionaries description]',它会打印出来。

这里发生了什么?这是预期的行为还是我做错了什么?

(这段代码,加上大字典,是用来完成大型sqlite数据库的关系链接的,不会用在可部署代码中。我只在iOS模拟器上运行它。我会完成此更新后,将更新后的数据库放入我的应用程序包中。)

【问题讨论】:

    标签: cocoa-touch cocoa nsdictionary nsmutabledictionary


    【解决方案1】:

    现在我看到了可能发生的情况,但它并没有完全回答为什么它没有打印到控制台。

    NSDictionary 的描述方法返回一个字符串,表示字典的内容,格式化为属性列表。对于这么大的字典,它会记录全部内容,大约有 100,000 条记录。

    当我执行po [[dictionaryMutableOfSynsetDictionaries description] substringToIndex:1000] 时,它将显示前 1000 个字符。如果我不以这种方式缩短它,则组合字符串需要一段时间,然后需要永远呈现到控制台。

    我确实通过问题行之前和之后的日志语句确认我的问题中的日志语句没有打印,而之前和之后的日志被打印。所以 NSLog 把它扔掉了,我想。

    【讨论】:

    • 我认为我在 NSLog 上遇到了类似的问题,只是似乎丢弃了很长的字符串——我从来没有费心去进一步检查,但很高兴看到我不是唯一一个遇到这个问题的人。虽然可能是控制台没有处理这么长的字符串?
    • 如果您使用po 命令,控制台似乎可以处理它。但在这种情况下,需要很长时间才能呈现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多