2012-04-05 31 views
1

是否有任何理由爲什麼存儲一個說~50MB的NSData對象到NSUserDefaults可能是一個壞主意?NSData大小和NSUserDefaults

documentation中沒有任何關於它的內容,但是每當我看到使用NSUserDefaults時,通常都會使用相當少量的數據。我認爲存儲在NSUserDefaults中比存儲在文件中更簡單,所以我想盡可能使用它。

回答

1
  1. NSUserDefaults的作爲存儲對象的屬性列表,所以有,它會使用文本(XML)格式的plist,而不是一個二進制的可能性。在這種情況下,NSData將發送ints描述到文件中,該文件比其實際大小大2倍,因爲它實際上是數據的十六進制表示(加上空格填充等)。

  2. 然後在概念上濫用/濫用。用戶默認值是用戶的默認值。也就是說,它們應該用於存儲首選項/設置,而不是整個文件。這是文件處理API的任務(C stdio函數,NSFileHandle等...)

希望這會有所幫助。

1

由於將50 MB的二進制數據轉換爲屬性列表或從屬性列表中轉換50 MB是非常低效的。在這種情況下,直接文件IO是唯一的選擇。

1

您的應用的NSUserDefaults域以XML屬性列表的形式寫入磁盤。當XML plist包含NSData時,數據以十六進制表示爲文本(爲了便於閱讀,還加上了一些空格) - 數據中的每個字節都變爲兩個字符的文本,因此您的50 MB數據變爲100 MB。更重要的是,屬性列表不是隨機訪問文件:如果您(或者在這種情況下,Apple的實現NSUserDefaults)想要讀取磁盤上屬性列表中的值,則會讀取並解析整個文件以創建一個NSDictionary。如果您進行了更改並希望將其保存到磁盤,則會將整個字典序列化並寫入文件。因此,讀取和解析或序列化和寫入需要比1KB文件長得多的100MB文件。這會發生在你(或蘋果框架中的某些代碼,因爲他們有時在內部使用NSUserDefaults)的任何時候都會調用-[NSUserDefaults synchronize],這可能會在應用程序的生命週期中發生多次。

如果你已經有一個NSData,它不是很難把它放在一個文件中 - 這就是-[NSData initWithContentsOfFile:]-[NSData writeToFile:atomically:]的目的。 (在應用程序的docs目錄中獲取讀/寫路徑只有一兩行,請參閱Xcode項目模板中的幾個示例。)

0

而訪問用戶默認設置的任何其他應用程序都必須花費讀取和解析您的100 MBytes的時間。