在我们的代码中,我们执行以下操作:

- (void) createComment:(NSString *)comment ForId:(NSString *)objectId
{
  [facebookArguments setObject:objectId forKey:FACEBOOK_COMMENTS_FOR_ID_KEY ];
  [facebookArguments setObject:comment forKey:FACEBOOK_COMMENTS_FOR_ID_COMMENT];
  [facebookPrefs writeToFile:facebookPrefsFilePath atomically: NO];
  [facebookArguments writeToFile:facebookArgumentsFilePath atomically:NO];
}

但在调用此代码时:
NSMutableDictionary* fbArgsDic = [[NSMutableDictionary alloc] initWithContentsOfFile: facebookArgumentsFilePath];
NSLog(@"Dictionary: %@", fbArgsDic);

以下是之前的日志输出:
2011-08-04 16:11:53.938 My_App[30909:207] Dictionary: {
    facebookGetCommentsForIdComment = Legend;
    facebookGetCommentsForIdKey = 10150249987646875;
    facebookLikeForIdKey = 10150249445616875;
}

之后:
2011-08-04 16:06:39.685 My_App[30693:207] Dictionary: {
    facebookGetCommentsForIdComment = Legend;
    facebookGetCommentsForIdKey = "1.015024998764688e+16";
    facebookLikeForIdKey = 10150249445616875;
}

它将facebook上的comments-for-id-key条目(如上图所示为nsstring)转换为nsnumber,并丢失了一些数字。这些是长号码,因为它们是facebook的id。
知道发生什么了吗?我们怎么解决?

最佳答案

字典应该被序列化为一个正确的列表,它应该保留类型。你确定id是一个真正的NSString开始吗?(另外,我同意其他注释者的看法,即应该使用不同的变量名,以避免与id类型混淆)
一种可能是它实际上是一个NSDecimalNumber,它以数字类型写出来,然后作为NSNumber解析回来,失去了精度。
试试这个:

NSLog(@"Class of id: %@", NSStringFromClass([id class]));

如果它毕竟是一种数字类型,您可以执行以下操作:
[facebookArguments setObject:[id stringValue] forKey:FACEBOOK_COMMENTS_FOR_ID_KEY];

关于iphone - 如何防止NSMutableDictionary在initWithContentsOfFile时将我的长NSString转换为NSNumber?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6942831/

10-17 00:52