2010-08-11 69 views
9

保存字典是否有大小限制?NSDictionary writeToFile

我正在嘗試使用writeToFile編寫一個包含大約100個嵌套字典的相當大的字典:但它永遠不會寫入,並且始終爲false。

這是一個限制,還是我做的事情不正確,

我用的代碼如下。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
NSString *fullPath = [documentsDir stringByAppendingPathComponent:@"test.plist"]; 

[myDict writeToFile: fullPath atomically:YES]; 
+0

你確定你沒有嵌入字典樹中的任何非可編碼對象。 Theres一組符合NSCoding的對象。在控制檯中進行檢查我有一種感覺,如果出現這種情況,它會將違規的對象細節留在那裏。 – 2010-08-11 15:48:00

回答

12

沒有大小限制(內存和磁盤空間除外)。

myDict是什麼內容?

如果它只是屬性列表中允許的一小組類,那麼您不能使用writeToFile:atomically:

要麼你需要限制你的字典只包含這些類的實例你需要使用不同的歸檔方法。

特別是,很多JSON庫會將NSNULL實例投入到集合中。這些不能被存檔。您需要將它們編輯出來,或者將其替換爲可以存檔的對象。

相關性:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Archiving/Archiving.html#//apple_ref/doc/uid/10000047i

+5

我有同樣的問題,並且問題是字典中的[NSNull null]對象:) – yasirmturk 2011-12-01 16:59:29

+0

@yasirmturk - 這樣做了!謝謝。 – Myxtic 2013-11-20 03:23:09

27

還有一個竅門此情況,除僅使用合格的對象(的NSNumber,NSString的,NSData的等情況下)的鑰匙必須的NSString對象。通常情況下,你可以使用NSDictionary關鍵字的任何對象,但要成功writeToFile:NSDictionary中的關鍵字需要是NSString實例。

+7

我在使用writeToFile保存NSDictionary時遇到了困難,這個答案幫助我解決了我遇到的問題。像這樣的怪癖可能會浪費時間來排除故障。 – ozz 2012-01-10 00:43:11

+0

想要確認這確實解決了我的問題!我使用NSNumber作爲鍵,但字典不會寫入數字後將其轉換爲字符串!謝謝@Otuken! – Motasim 2012-02-13 15:04:09

4

我會再添加一個技巧,以至於我碰到了Lion。在你調用NSDictionary的writeToFile:atomically:之前,你想寫plist的文件夾必須存在。您可以使用NSFileManager來測試是否存在,並在必要時創建一個新文件夾。

0

我有這個,正如別人提到的那樣,字典不能用一些數據類型(值得注意的NULL)保存。

因爲我的字典來自服務器(以JSON的形式),所以我無法保證它裏面有什麼,所以我在JSON序列化之前保存了RAW數據(來自dataWithContentsOfURL)。爲此,我猜你可以將字典轉換爲NSData並保存 - 例如;

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict]; 

然後稍後檢索並轉換回來這樣。

NSDictionary *JSONDict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:convertedDATA];