2014-05-13 9 views
9

में बड़ी मात्रा में वर्चुअल मेमोरी (बेनामी वीएम) का उपयोग करके UILabel (CALayer) देखता है। मैं लगभग UILabel प्रति वर्चुअल मेमोरी के बारे में 235 KB देखता हूं।उइलाबेल (कैलायर) वर्चुअल मेमोरी

मुझे लगता है कि यह शायद आईओएस 7.1 या 7.1.1 के साथ एक नया मुद्दा है।

क्या यह उम्मीद है?

मैंने एक साधारण प्रोग्राम बनाया जो 500 UILabels और Instruments बनाता है जो स्मृति के 115 एमबी दिखाता है। लगभग 1500 लेबल पर एप्लिकेशन ओएस द्वारा समाप्त कर दिया जाता है।

for (int i = 0; i < 500; i++) 
{ 
    index = (int)[self.items count]; 
    index++; 

    frame = CGRectMake(10.0, 20, 300.0, 50.0); 

    UILabel *newLabel = [[UILabel alloc] initWithFrame:frame]; 
    newLabel.text = [NSString stringWithFormat:@"This is text for label: %d", index]; 
    newLabel.backgroundColor = [UIColor whiteColor]; 
    [self.view addSubview:newLabel]; 

    [self.items setObject:newLabel forKey:[NSNumber numberWithInteger:index]]; 
} 

विचार?

उत्तर

3

इस तरह की चीज (स्टैक ओवरफ़्लो या ऐप्पल को) की रिपोर्ट करते समय, आपको वास्तव में अनावश्यक अतिरिक्त कोड को खत्म करना चाहिए।

for (int i = 0; i < 500; i++) 
{ 
    CGRect frame = CGRectMake(10.0, 20, 300.0, 50.0); 
    UILabel *newLabel = [[UILabel alloc] initWithFrame:frame]; 
    newLabel.backgroundColor = [UIColor whiteColor]; 
    [self.view addSubview:newLabel]; 
} 

मेरी मशीन पर 129MB उपयोग करने देता है का कारण बनता है कि: यह कोड घटना पुन: पेश करने के लिए पर्याप्त है। (उपकरण का उपयोग करने की कोई ज़रूरत नहीं है: एक्सकोड अब मेमोरी उपयोग को सीधे दिखाता है।)

मेरी पहली प्रतिक्रिया थी: "मुझे लगता है कि मुझे यह आश्चर्यजनक आश्चर्य नहीं मिला। अगर आप frame को एक छोटे से आय में बदलते हैं, तो कम स्मृति का उपयोग किया जाता है विचार महंगे हैं! उन्हें बिटमैप द्वारा समर्थित किया जाता है। "

हालांकि, यदि आप UILabel को एक सादे UIView में बदलते हैं, तो केवल 13 एमबी का उपयोग किया जाता है। मुझे लगता है कि एक बग फाइलिंग वारंट के लिए पर्याप्त अंतर है।

+1

हालांकि, एप्पल आपको बता सकता है कि अपने अधिकार में कोई नहीं दिमाग 500 लेबल का उपयोग करेगा। आखिरकार, यही कारण है कि टेबल अपनी कोशिकाओं का पुन: उपयोग करते हैं; आपके पास 1000 पंक्ति तालिका हो सकती है लेकिन इसमें केवल 12 वास्तविक कक्ष होते हैं (इसलिए, प्रति पंक्ति एक लेबल होने पर केवल 12 वास्तविक लेबल)। – matt

+0

मुझे नहीं लगता कि यह जवाब सटीक है। मैं कल्पना नहीं कर सकता कि विचार बिटमैप्स द्वारा समर्थित हैं। शायद लेबल हैं, लेकिन अगर मैं हर दृश्य होगा तो मुझे आश्चर्य होगा। आपके पास इसके लिए कोई लिंक है? – kritzikratzi

+0

@ kritzikratzi मैंने नहीं कहा कि विचार बिटमैप्स द्वारा समर्थित हैं। मैंने कहा कि मेरा पहला जवाब यह कहना था कि वे हैं। यह काम करता है कि यह काम विभिन्न डब्ल्यूडब्ल्यूडीसी वीडियो से आता है जहां ऐप्पल वास्तव में बिटमैप के बारे में बात करता है। – matt

4

उइलाबेल, और ड्रॉरेक्ट (कम से कम आईओएस 7+ पर) का उपयोग करने वाले किसी भी दृश्य को बनावट द्वारा समर्थित किया जाता है, इसलिए प्रत्येक UILabel बहुत मेमोरी का उपयोग करेगा, लेबल जितना बड़ा होगा, उतनी अधिक मेमोरी होगी।

मुझे यह आपके डूडल के लिए मेरे फोटो संपादन एक्सटेंशन में विशेष रूप से दर्दनाक पाया गया है जो फ़ोटो ऐप में टेक्स्ट जोड़ने की अनुमति देता है। दुर्भाग्यवश मुझे टेक्स्ट की स्केल रेंज को बहुत सीमित करना है क्योंकि क्रैश होने से पहले नियमित ऐप की तुलना में फोटो एक्सटेंशन मेमोरी उपयोग तक सीमित हैं।

यह आसानी से उपकरणों चल रहा है और बड़े UILabel के का एक समूह का आवंटन और उनके पाठ की स्थापना और यह सुनिश्चित करना है कि वे सब दिखाई दे रहे हैं, यानी द्वारा सत्यापित किया जा सकता:

CGRect f = CGRectMake(0.0.0f, 0.0f, 300.0f, 300.0f); 
for (NSInteger i = 0; i < 100; i++) 
{ 
    UILabel* l = [[UILabel alloc] initWithFrame:f]; 
    l.backgroundColor = UIColor.blueColor; 
    l.textColor = UIColor.whiteColor; 
    l.text = @"UILabel text for the memory test"; 
    l.numberOfLines = 0; 
    [self.view addSubview:l]; 
} 
संबंधित मुद्दे