2011-03-05 172 views
11

這可能聽起來像一個完全愚蠢的問題,但我怎麼能得到一個NSDictionary的字節大小?我可以將它轉換爲NSData,然後獲取它的長度?NSDictionary的字節大小

幫助!

回答

18

你應該多說一下你爲什麼關心字典的字節大小,因爲答案可能會有所不同。

一般來說,NSDictionary在內存中的足跡的「大小」並不是你能看到或關心的東西。它從程序員那裏抽象出它的存儲機制,並使用某種形式的開銷,超出了存儲的實際數據。

但是,您可以將字典序列化爲NSData。如果字典的內容只是像NSNumber,NSString,NSArray,NSData,NSDictionary那樣的「原始」類型,則可以使用NSPropertyListSerialization類將其轉換爲二進制屬性列表,該列表將關於其內容的最緊湊字節表示你可以得到:

NSDictionary * myDictionary = /* ... */; 
NSData * data = [NSPropertyListSerialization dataFromPropertyList:myDictionary 
    format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];  
NSLog(@"size: %d", [data length]); 

如果包含其他自定義對象,你可以使用的NSKeyedArchiver將其歸檔到一個NSData,但這將是顯著更大,需要您自定義類的合作。

+0

謝謝,這工作得很好!我使用它的原因是獲取[NSHTTPURLResponse allHeaderFields]發送的http頭的大小,並查看這些頭的大小(嘗試監視網絡使用情況)......除非有更好的方法? – mootymoots 2011-03-05 22:43:10

+0

查看網絡流量的更直接的方法是查看網絡流量。 :)運行一個Web代理並檢查流量?在桌面上查看Charles Proxy,或Wireshark或類似的東西。 – 2011-03-05 23:24:31

+0

'dataFromPropertyList:format:errorDescription:'已棄用:在iOS 8.0中首先不推薦使用 - 使用dataWithPropertyList:format:options:error:instead。 – tdios 2015-10-05 19:02:30

2

您可以通過調用該得到任何階級的大小:

#import "objc/runtime.h" 
int size = class_getInstanceSize([NSDictionary class]); 

這將返回類的大小,而不是實際尺寸由實例化對象所佔據。如果你想要一個實例化對象的大小:

#import "malloc/malloc.h" 
int size = malloc_size(myObject); 
+4

這隻給你實例的實例變量的大小,它不會給你對象分配的任何東西的大小,也沒有任何方法可以這樣做。它也不適用於'NSDictionary',因爲在你的應用中永遠不會有'NSDictionary'的實例。只是私人子類的實例。 – bbum 2011-03-06 03:08:10