2011-08-04 16 views
3

在我們的代碼中執行以下操作:如何在initWithContentsOfFile時阻止NSMutableDictionary將我的長NSString轉換爲NSNumber?

- (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並丟失了一些數字。這些是LONG號碼,因爲它們是Facebook的ID。

任何想法發生了什麼以及我們如何解決它?

+0

你爲什麼不張貼日誌輸出?還有一個示例ID。 – Joe

+1

我想你不應該調用那個字符串'id',因爲它是一個保留關鍵字。不知道這是否是問題,雖然 – andreamazz

+0

我認爲'facebookGetCommentsForIdKey'字典是autoreleased。試用'保留'?? – Hisenberg

回答

3

字典應該被序列化爲一個正確的列表,它應該保留類型。你確定id真的是NSString開始嗎? (另外,我同意其他評論者的意見,您應該使用不同的變量名稱以避免與id類型混淆)。

其中一種可能性是它實際上是一個NSDecimalNumber,它被作爲數字類型寫出並解析回作爲NSNumber,失去精確度。

試試這個:

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

而如果它是一個數字類型畢竟,你可以這樣做:

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

您先生,贏得互聯網。我認爲方法簽名會爲我強制執行NSString *。並非如此。也重命名了變量。謝謝。 –

+0

我假設你從JSON或XML解析器中獲取該數字,並且爲該值提供的方法是鍵入'id',這意味着「此變量是動態類型的」。我強烈建議您明確檢查從互聯網上獲得的任何價值的實際類型,例如'[val isKindOfClass:[NSNumber class]]'來捕捉任何類型的不一致。這樣,如果Web API有一個錯誤,並給你錯誤的類型,你可以適度地處理這種情況而不是崩潰。 (我從Etsy API的痛苦經歷中學到了這一點。) –

+0

這是通過facebook庫的facebook fql API。好吧。 –