如何阻止NSMutableDictionary在initWithContentsOfFile上将我的长NSString转换为NSNumber?

时间:2011-08-04 14:03:50

标签: iphone objective-c

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

- (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。

知道发生了什么以及我们如何解决它?

1 个答案:

答案 0 :(得分:3)

字典应该被序列化为正确的列表,这应该保留类型。您确定id真的是NSString吗? (另外,我同意其他评论者的意见,你应该使用不同的变量名称,以避免与类型id混淆。)

一种可能性是它实际上是NSDecimalNumber,它被写成数字类型并作为NSNumber解析回来,失去了精确度。

试试这个:

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

如果它毕竟是数字类型,你可以这样做:

[facebookArguments setObject:[id stringValue] forKey:FACEBOOK_COMMENTS_FOR_ID_KEY];