2014-04-18 124 views
0

NSDictionary數據密鑰允許的最大大小是多少?即:NSDictionary數據密鑰的最大大小

256字節,1024個字節等

+3

「NSDictionary」中的鍵是對象 - 類型爲「id」的項。它們存儲爲指針,並沒有真正的固有「大小」。你想用什麼樣的物件作爲鑰匙? – bdesham

+0

我想將二進制數據保存爲一個plist內的小圖形並根據需要進行存儲。 – user3549620

+0

@ user3549620根據您的評論,爲什麼您的問題是關鍵的,因爲您似乎真的想了解這些值? – rmaddy

回答

0

有在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

+0

主要問題是我之前提到的,事實上,蘋果文檔說「最好不要在屬性列表中使用數據對象來存放大量的二進制數據」。他們將什麼定義爲「大」? 1MB,100GB,1TB? – user3549620

+0

NSDictionary不等於plist文件。因此,將大量的二進制數據保存到NSDictionary中不會損害性能。我使用類似的方法將大數據存儲到後臺線程中的plist。我會更新我的答案。 – Selvin

+0

不錯的例子,我之前使用過調度隊列,所以它很有意義。除了使用從NSDictionary讀取的任何項目的調度隊列之外,是否還需要創建緩衝區?只是好奇。 – user3549620

0

NSDictionary中的鍵和值是id類型的對象項。它們在內部存儲爲具有固定大小的指針。沒有任何「太大」的對象不能放入NSDictionary

(如果你想序列你的字典的plist中,你需要確保該字典僅持有the data types that can be serialized for you。)

+0

序列化數據會更好嗎?固定大小是什麼意思? – user3549620

0

在一個NSDictionary的東西必須是對象。由於對象總是按引用而不是按值存儲,所以對象的大小根本不重要。

如果您需要將任意數據存儲在Foundation集合中,但不認爲對象包裝是值得的,則NSValue和NSData通常是您的最佳投注。

+0

很高興知道。我擔心的是,如果我存儲了一個例如10​​0KB的對象,在訪問它時可能會導致內存問題等。 – user3549620

1

沒有大小限制本身上在NSDictionary的鍵或值,如其他人指出只對鍵和值對象的引用被存儲,以及基準通常爲4或8個字節。對象的大小主要受限於(虛擬)內存的大小。

但是,如您的評論所示,這似乎並不是您真正的問題。相反,您擔心字典的磁盤表示大小可能不會導致性能問題。雖然將大文件讀入內存需要時間,但您可以輕鬆讀取很多兆字節,並且字典中的一些「小圖形」不太可能成爲問題。

使用plist並不是您的最佳選擇 - 這些是相當有限的一組數據類型的序列化表示,例如NSImage不是其中之一,並且更適合其他用途。你應該看看標準的Cocoa歸檔類,它們將處理實現NSCoding的任何類,許多標準類包括集合(NSDictionaryNSArray等)和圖像。閱讀Archives and Serializations Programming Guide

HTH

+0

有趣的是,特別是您提到的有關NSImage的內容。我以前只是從一個文件讀取數據到NSImage中,所以我認爲沒有辦法讓它像訪問文件一樣訪問一串數據。我將不得不重新考慮一些可能基於我想象的信息的事情。 – user3549620