NSDictionary数据密钥的最大大小

时间:2014-04-18 17:13:53

标签: objective-c cocoa

NSDictionary数据密钥允许的最大大小是多少?即:

256字节,1024字节等

4 个答案:

答案 0 :(得分:1)

NSDictionary中的键或值没有本身的大小限制,正如其他人指出的那样,仅存储对键和值对象的引用,并且引用是通常是4或8个字节。对象的大小主要受(虚拟)内存大小的限制。

但是,正如您的评论所示,这似乎不是您的实际问题。相反,您担心字典的磁盘表示可能不会导致性能问题。将非常大的文件读入内存需要花费时间,您可以轻松读取数兆字节,而字典中的一些“小图形”不太可能成为问题。

使用plist不是您的最佳选择 - 这些是非常有限的一组数据类型的序列化表示,NSImage例如不是其中之一,更适合其他用途。您应该查看标准的Cocoa归档类,它们将处理任何实现NSCoding的类,并且许多标准类包括集合(NSDictionaryNSArray等)和图像。阅读Archives and Serializations Programming Guide

HTH

答案 1 :(得分:0)

NSDictionary Key没有以字节为单位的最大大小限制。

如果您打算询问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

答案 2 :(得分:0)

NSDictionary中的键和值是id类型的对象项。它们作为指针存储在内部,具有固定的大小。没有任何对象“太大”无法放入NSDictionary

(如果要将字典序列化为plist,则需要确保字典仅保留the data types that can be serialized for you。)

答案 3 :(得分:0)

NSDictionary中的东西必须是对象。由于对象总是通过引用而不是值存储,因此对象的大小根本不重要。

如果你需要在Foundation集合中存储任意数据但不认为对象包装器是值得的,那么NSValue和NSData通常是你最好的选择。