How to calculate total size of NSDictionary
object?
i have 3000 StudentClass objects in NSDictionary
with different keys. And i want to calculate total size of dictionary in KB.
I used malloc_size()
but it always return 24 (NSDictionary
contain either 1 object or 3000 object)
sizeof()
also returns always same.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
You could try to get all the keys of the Dictionary in an array and then iterate the array to find the size, it might give you the total size of the keys inside the dictionary.
NSArray *keysArray = [yourDictionary allValues];
id obj = nil;
int totalSize = 0;
for(obj in keysArray)
{
totalSize += malloc_size(obj);
}
回答2:
You can also find this way:
Objective C
NSDictionary *dict=@{@"a": @"Apple",@"b": @"bApple",@"c": @"cApple",@"d": @"dApple",@"e": @"eApple", @"f": @"bApple",@"g": @"cApple",@"h": @"dApple",@"i": @"eApple"};
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:dict forKey:@"dictKey"];
[archiver finishEncoding];
NSInteger bytes=[data length];
float kbytes=bytes/1024.0;
NSLog(@"%f Kbytes",kbytes);
Swift 4
let dict: [String: String] = [
"a": "Apple", "b": "bApple", "c": "cApple", "d": "dApple", "e": "eApple", "f": "bApple", "g": "cApple", "h": "dApple", "i": "eApple"
]
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(dict, forKey: "dictKey")
archiver.finishEncoding()
let bytes = data.length
let kbytes = Float(bytes) / 1024.0
print(kbytes)
回答3:
The best way to calculate the size of big NSDictionary
, I think, would be converting it to NSData
and get the size of the data. Good Luck!
回答4:
Might be useful to convert to NSData if your dictionary contains standard classes (eg. NSString) and not custome ones:
NSDictionary *yourdictionary = ...;
NSData * data = [NSPropertyListSerialization dataFromPropertyList:yourdictionary
format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];
NSLog(@"size of yourdictionary: %d", [data length]);