2011-03-05 17 views
11

का बाइट आकार यह पूरी तरह से बेवकूफ सवाल की तरह लग सकता है, लेकिन मैं NSDictionary के बाइट्स में आकार कैसे प्राप्त कर सकता हूं? क्या मैं इसे एनएसडीटा में बदल सकता हूं, और उसके बाद इसकी लंबाई प्राप्त कर सकता हूं?एनएस डिक्शनरी

सहायता!

उत्तर

18

आपको यह कहना चाहिए कि आप बाइट्स में शब्दकोश के आकार की परवाह क्यों करते हैं, क्योंकि उत्तर अलग-अलग हो सकता है।

सामान्य रूप से, स्मृति में एनएस डिक्शनरी के पदचिह्न का "आकार" ऐसा कुछ नहीं है जिसे आप देख सकते हैं या उसकी परवाह कर सकते हैं। यह प्रोग्रामर से अपने भंडारण तंत्र को सार तत्व बनाता है, और यह भंडारण के वास्तविक डेटा से परे ओवरहेड के कुछ रूपों का उपयोग करता है।

हालांकि, आप एनएसडीटा को शब्दकोश को क्रमबद्ध कर सकते हैं। यदि शब्दकोश की सामग्री केवल "आदिम" प्रकार हैं जैसे NSNumber, NSString, NSArray, NSData, NSDictionary, तो आप इसे एक बाइनरी प्रॉपर्टी सूची में बदलने के लिए NSPropertyListSerialization क्लास का उपयोग कर सकते हैं, जो इसकी सामग्री के सबसे कॉम्पैक्ट बाइट प्रतिनिधित्व के बारे में होगा है कि आप प्राप्त कर सकते हैं:

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

यह अन्य कस्टम ऑब्जेक्ट हैं, तो आप एक NSData करने के लिए यह संग्रह करने के लिए NSKeyedArchiver इस्तेमाल कर सकते हैं, लेकिन यह काफी बड़ा हो जाएगा और अपने कस्टम वर्गों के सहयोग की आवश्यकता है।

+0

धन्यवाद, यह बहुत अच्छा काम करता है! इसका उपयोग करने का कारण है [NSHTTPURLResponse allHeaderFields] द्वारा वापस भेजे गए http शीर्षलेखों का आकार प्राप्त करना, और उन शीर्षकों का आकार (नेटवर्क उपयोग की निगरानी करने का प्रयास कर रहा है) ... जब तक कोई बेहतर तरीका न हो? – mootymoots

+0

नेटवर्क यातायात को देखने का अधिक सीधा तरीका नेटवर्क यातायात को देखना है। :) एक वेब प्रॉक्सी चलाएं और यातायात का निरीक्षण करें? डेस्कटॉप पर चार्ल्स प्रॉक्सी, या वायर्सहार्क या ऐसा कुछ देखें। –

+0

'डेटाप्रोप्रोपर्टी लिस्ट: प्रारूप: त्रुटि डिस्क्रिप्शन:' बहिष्कृत है: पहले आईओएस 8.0 में बहिष्कृत - डेटा का उपयोग करेंथ्रोपर्टी लिस्ट: प्रारूप: विकल्प: त्रुटि: इसके बजाए। – tdios

2

आप इस फोन करके किसी भी वर्ग के आकार प्राप्त कर सकते हैं:

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

यह आपको वर्ग के आकार वापस आ जाएगी, लेकिन नहीं वास्तविक आकार एक instantiated वस्तु के कब्जे में। यदि आप तत्काल ऑब्जेक्ट का आकार चाहते हैं:

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

जो आपको केवल उदाहरण के आवृत्ति चर का आकार देता है, यह आपको ऑब्जेक्ट आवंटित करने वाले किसी भी चीज़ का आकार नहीं देता है और न ही ऐसा करने का कोई तरीका है। यह 'NSDictionary' के लिए भी काम नहीं करेगा, क्योंकि आपके ऐप में 'NSDictionary' का कभी भी उदाहरण नहीं है; निजी उपclass के बस उदाहरण। – bbum

संबंधित मुद्दे