回答
有在NSDictionary的關鍵字節沒有最大大小限制。
也許如果你打算詢問一個NSDictionary值的最大限制,那麼就沒有這個限制。
NSDictionary的密鑰的唯一性由NSObject的hash
方法決定。
更新:
如果你想相處的字典訪問牢度和益處,如果你要堅持你的數據,那麼雙層做法可能爲你工作。在這種方法中;
首先將數據存入NSMutableDictionary
,然後在後臺將其推入plist文件。它看起來像這樣。
在.h文件中,聲明
NSMutableDictionary *userDictionary;
然後在.m文件,定義這樣的方法,
- (void)storeValue:(id)value forKey:(id)key {
[userDictionary setValue:value forKey:key];
[self commitIntoPlist];
}
-(id)getValueForKey:(NSString *)key{
return [userDictionary objectForKey:key];
}
- (void)removeObjectForKey:(NSString *)key {
[userDictionary removeObjectForKey:key];
[self commitIntoPlist];
}
//commit the data into plist
- (void)commitIntoPlist {
dispatch_once(&onceCommitToken, ^{
commitQueue = dispatch_queue_create([@"com.yourappname.commit" cStringUsingEncoding:NSUTF8StringEncoding], DISPATCH_QUEUE_CONCURRENT);
});
dispatch_async(commitQueue, ^{
//here write the dictionary into plist
[self writeDictionaryIntoPlistFile:userDictionary];
});
}
使用這種方法,你會得到字典和持久性的速度的Plist在一起。你可以把這個班保持爲單身,並且在使用之前不要忘記分配NSMutableDictionary
。
主要問題是我之前提到的,事實上,蘋果文檔說「最好不要在屬性列表中使用數據對象來存放大量的二進制數據」。他們將什麼定義爲「大」? 1MB,100GB,1TB? – user3549620
NSDictionary不等於plist文件。因此,將大量的二進制數據保存到NSDictionary中不會損害性能。我使用類似的方法將大數據存儲到後臺線程中的plist。我會更新我的答案。 – Selvin
不錯的例子,我之前使用過調度隊列,所以它很有意義。除了使用從NSDictionary讀取的任何項目的調度隊列之外,是否還需要創建緩衝區?只是好奇。 – user3549620
NSDictionary
中的鍵和值是id
類型的對象項。它們在內部存儲爲具有固定大小的指針。沒有任何「太大」的對象不能放入NSDictionary
。
(如果你想序列你的字典的plist中,你需要確保該字典僅持有the data types that can be serialized for you。)
序列化數據會更好嗎?固定大小是什麼意思? – user3549620
在一個NSDictionary的東西必須是對象。由於對象總是按引用而不是按值存儲,所以對象的大小根本不重要。
如果您需要將任意數據存儲在Foundation集合中,但不認爲對象包裝是值得的,則NSValue和NSData通常是您的最佳投注。
很高興知道。我擔心的是,如果我存儲了一個例如100KB的對象,在訪問它時可能會導致內存問題等。 – user3549620
沒有大小限制本身上在NSDictionary
的鍵或值,如其他人指出只對鍵和值對象的引用被存儲,以及基準通常爲4或8個字節。對象的大小主要受限於(虛擬)內存的大小。
但是,如您的評論所示,這似乎並不是您真正的問題。相反,您擔心字典的磁盤表示大小可能不會導致性能問題。雖然將大文件讀入內存需要時間,但您可以輕鬆讀取很多兆字節,並且字典中的一些「小圖形」不太可能成爲問題。
使用plist並不是您的最佳選擇 - 這些是相當有限的一組數據類型的序列化表示,例如NSImage
不是其中之一,並且更適合其他用途。你應該看看標準的Cocoa歸檔類,它們將處理實現NSCoding
的任何類,許多標準類包括集合(NSDictionary
,NSArray
等)和圖像。閱讀Archives and Serializations Programming Guide。
HTH
有趣的是,特別是您提到的有關NSImage的內容。我以前只是從一個文件讀取數據到NSImage中,所以我認爲沒有辦法讓它像訪問文件一樣訪問一串數據。我將不得不重新考慮一些可能基於我想象的信息的事情。 – user3549620
- 1. Cassandra的最大密鑰大小
- 2. PBE中的最大密鑰大小?
- 3. .NET RSA加密:最小密鑰大小?
- 4. 大密鑰大小的加密算法
- 5. Redis:顯示密鑰的數據庫大小/大小
- 6. 使用大於密鑰大小的密鑰加密消息
- 7. 的NodeJS加密密碼AES256最大數據大小
- 8. mcrypt_encrypt():密鑰的大小爲
- 9. 使用密鑰存儲無限大小的巨大json數據
- 10. 爲什麼免費網絡密鑰具有最大文件(數據塊)大小?
- 11. 最大數據大小
- 12. 如何限制密鑰空間cassandra的最大大小?
- 13. .NET DSACryptoServiceProvider密鑰大小
- 14. DESedeKeySpec錯誤密鑰大小
- 15. InvalidKeyException:非法密鑰大小
- 16. 非法密鑰大小
- 17. 字典/ hash_map密鑰大小
- 18. HBase:行密鑰大小
- 19. java.security.InvalidKeyException:非法密鑰大小
- 20. 得到json的最大數密鑰
- 21. InnoDB最大密鑰長度
- 22. Java/Clojure BouncyCastle報告錯誤的密鑰大小,但密鑰大小正確
- 23. 計算加密數據的最大大小
- 24. 使用公鑰進行RSA加密。基於密鑰的數據大小
- 25. 加密密鑰大小和算法
- 26. .NET中的最小郵件大小公鑰加密
- 27. 如何刪除最大堆中的最小密鑰?
- 28. Symfony2的最大數據大小
- 29. MySQL數據庫的最大表大小
- 30. 半徑的最大數據包大小
「NSDictionary」中的鍵是對象 - 類型爲「id」的項。它們存儲爲指針,並沒有真正的固有「大小」。你想用什麼樣的物件作爲鑰匙? – bdesham
我想將二進制數據保存爲一個plist內的小圖形並根據需要進行存儲。 – user3549620
@ user3549620根據您的評論,爲什麼您的問題是關鍵的,因爲您似乎真的想了解這些值? – rmaddy